我试图使用紧凑的折叠表达没有成功.
例如,这是一个有效的 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()吗?(什么是正确的?)要么
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)
注意<最后一个之前和之前的括号>.
折叠表达式需要括号,因此:
(std::is_floating_point_v<V> && ... && std::is_floating_point_v<Vs>)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1151 次 |
| 最近记录: |