C++ 17倍表达式语法?

Pic*_*ent 7 c++ fold c++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&...)
{
}
Run Code Online (Sandbox Code Playgroud)

我想将它翻译成更紧凑的形式(不使用中间体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&...)
{
}
Run Code Online (Sandbox Code Playgroud)

但是,这显然是非法的C++,因为g ++和clang ++编译器都无法编译它.

我的问题:

  • 它只是一个语法问题foo_compact()吗?(什么是正确的?)

要么

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

Rak*_*111 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&...)
{
}
Run Code Online (Sandbox Code Playgroud)

注意<最后一个之前和之前的括号>.

  • TIL折叠表达式可用作模板参数.对我来说是一个重要的"呃"时刻. (3认同)

Jar*_*d42 6

折叠表达式需要括号,因此:

(std::is_floating_point_v<V> && ... && std::is_floating_point_v<Vs>)
Run Code Online (Sandbox Code Playgroud)