C++17折叠表达式语法?

2022-08-02 00:00:00 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()中的语法问题吗?(什么是正确的?)

  • 折叠表达式不能直接用于复杂子表达式,我们不能比使用两步方法(foo()使用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&...)
{
}

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

相关文章