【问题标题】:What is the syntax for the 'requires' expression of a variadic template with contraints?带有约束的可变参数模板的“需要”表达式的语法是什么?
【发布时间】:2019-12-10 02:56:21
【问题描述】:

如果我有一个可变参数模板;

template<typename T>
concept Fooable = requires (T t) { t.bar() -> bool; };

struct Foo {
  int big_foo;

  template<std::Integral T, Fooable ... U>
  explicit Foo(T&& i, U&& ... f) noexcept
    : big_foo {std::forward<T>(i)}
  {
    Something::something(std::forward<U>(f)...);
    ...
  }

};

然后模板的定义及其约束按预期工作。

但如果我“要求”更多对 Foo 的约束,因此使用“要求”表达式格式,例如;

  template<typename T, typename ... U>
    requires std::Integral<T>
          && Fooable<U> && BillyBobable<U> // WHAT GOES HERE? ELLIPSIS... BUT WHERE?
  explicit Foo(T&& i, U&& ... f) noexcept
    : big_foo {std::forward<T>(i)}
  {
    SOMETHING::something(std::forward<U>(f)...);
    ...
  }

那么:我应该使用什么语法作为可变参数U 在表达式中展开它?

【问题讨论】:

    标签: c++ variadic-templates c++20 c++-concepts


    【解决方案1】:

    您可以在此处使用常用的 C++17 折叠表达式语法:

    template<typename T, typename ... U>
      requires std::Integral<T>
            && ((Fooable_concept<U> && BillyBobable_concept<U>) && ...)
    explicit Foo(T&& i, U&& ... f) noexcept
    

    或者,您可以通过引入一个合并两者的新概念来回到之前的语法:

    template <typename T>
    concept FooAndBillyBob = Fooable_concept<T> && BillyBobable_concept<T>;
    
    template <std::Integral T, FooAndBillyBob ... U>
    explicit Foo(T&& i, U&& ... f) noexcept
    

    注意:请不要将您的概念命名为*_concept

    【讨论】:

    • 太棒了。谢谢。
    • 我才刚刚开始尝试概念,并试图将它们与类型区分开来。这是一个坏习惯。到目前为止,我还没有在任何实际代码中使用它们。谢谢你。很好的答案。
    • 使用 GCC 9.1,我现在收到“内部编译器错误:在 tsubst_constraint,在 cp/constraint.cc:1948”,所以我想这实际上还没有准备好用于一般用途!
    • @DavidHParry 不,但请将其作为错误报告提交。 ICE 始终是编译器错误(错误本身可能会继续要求您报告它)。
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 2022-06-13
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多