С ++ Синтаксис 17-кратного выражения?

Я пытаюсь использовать компактное выражение сгиба без успеха.

Например, вот за работой Код C ++ 17

template <bool... B>
struct Fold_And : std::integral_constant<bool, (B && ...)>
{
};

template <bool... B>
constexpr auto Fold_And_v = Fold_And<B...>::value;template <typename V, typename... Vs>
std::enable_if_t<
Fold_And_v<std::is_floating_point_v<V>,
std::is_floating_point_v<Vs>...> >
foo(const V& v, const Vs&...)
{
}

Я хочу перевести его в более компактную форму (не используя промежуточный Fold_And)

template <typename V, typename... Vs>
std::enable_if_t<std::is_floating_point_v<V> && ... &&
std::is_floating_point_v<Vs> >
foo_compact(const V& v, const Vs&...)
{
}

Тем не менее, это явно недопустимо в C ++, так как компиляторы g ++ и clang ++ не могут его скомпилировать.

Мой вопрос:

  • это только проблема синтаксиса в foo_compact()? (что является правильным?)

Или же

  • сложное выражение нельзя использовать напрямую со сложными подвыражениями, и мы не можем добиться большего успеха, чем использование двухэтапного подхода (foo() код с использованием Fold_And структура)?

7

Решение

Вы почти получили это! Сложить выражения иметь быть заключенным в скобки:

template <typename V, typename... Vs>
std::enable_if_t<(std::is_floating_point_v<V> && ... &&
std::is_floating_point_v<Vs>)>
foo_compact(const V& v, const Vs&...)
{
}

Обратите внимание на круглые скобки после < и до последнего >,

14

Другие решения

Выражение сгиба требует скобок, поэтому:

(std::is_floating_point_v<V> && ... && std::is_floating_point_v<Vs>)
6