C++17 折叠表达式语法?
C++17 fold expression syntax?
我尝试使用压缩折叠表达式但没有成功。
例如这里是一个工作 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()
中的语法问题吗? (哪个是正确的?)
或
- 折叠表达式不能直接用于复杂的子表达式,我们不能比使用 2 步方法做得更好(
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&...)
{
}
注意 <
之后和最后一个 >
之前的括号。
折叠表达式需要括号,所以:
(std::is_floating_point_v<V> && ... && std::is_floating_point_v<Vs>)
我尝试使用压缩折叠表达式但没有成功。
例如这里是一个工作 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()
中的语法问题吗? (哪个是正确的?)
或
- 折叠表达式不能直接用于复杂的子表达式,我们不能比使用 2 步方法做得更好(
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&...)
{
}
注意 <
之后和最后一个 >
之前的括号。
折叠表达式需要括号,所以:
(std::is_floating_point_v<V> && ... && std::is_floating_point_v<Vs>)