C ++ 17倍表达式语法?

时间:2017-10-26 16:03:18

标签: c++ c++17 fold

我试图使用紧凑的折叠表达而没有成功。

例如,这是一个工作 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()中的语法问题? (什么是正确的?)

或者

  • fold表达式不能直接用于复杂的子表达式,我们不能比使用2步法(使用foo()结构的Fold_And代码)更好吗?

2 个答案:

答案 0 :(得分:14)

你几乎得到了它!折叠表达式被括号括起来:

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&...)
{
}

请注意<之后和最后>之前的括号。

答案 1 :(得分:6)

折叠表达式需要括号,所以:

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