代码之家  ›  专栏  ›  技术社区  ›  Picaud Vincent

C++17倍表达式语法?

  •  9
  • Picaud Vincent  · 技术社区  · 8 年前

    我试图使用紧凑的折叠表达,但没有成功。

    例如,这里有一个 工作 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_和 结构)?
    2 回复  |  直到 8 年前
        1
  •  16
  •   Rakete1111    8 年前

    你差点就成功了!折叠表达式 用括号括起来:

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

    注意后面的括号 < > .

        2
  •  6
  •   Jarod42    8 年前

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

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