【问题标题】:C++17 fold expression syntax?C++17折叠表达式语法?
【发布时间】:2017-10-26 16:03: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&...)
{
}

我想把它翻译成更紧凑的形式(不使用中间的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 结构)?

【问题讨论】:

    标签: c++ c++17 fold


    【解决方案1】:

    你几乎明白了!折叠表达式必须用括号括起来:

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

    注意&lt; 之后和最后一个&gt; 之前的括号。

    【讨论】:

    • Argg... 初学者的错误!感谢和抱歉的噪音!
    • TIL 折叠表达式可以用作模板参数。对我来说是一个重要的“duh”时刻。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 2020-01-25
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多