【问题标题】:Apply a conjunction of constraints to a parameter pack将约束的结合应用于参数包
【发布时间】:2017-11-19 22:22:51
【问题描述】:

给定一个简单的变量模板

template<typename... T>
class A {};

还有两个或多个概念C1C2之类的

template<typename T>
concept bool C1() { ... };

如何在A 的参数包的所有元素上应用C1C2 的连词,例如:

template<typename... T>
requires C1<T>... || C2<T>...     // nok
class A {};

以上内容无法编译。我正在寻找一种方法来指定这一点,而无需编写像 C1orC2 这样的新概念。

【问题讨论】:

  • 我认为你刚刚弄错了折叠表达式语法。这是(C1&lt;T&gt; || ...) || (C2&lt;T&gt; || ...)。如果你的意思是参数包应该作为一个整体应用C1&lt;T...&gt; || C2&lt;T...&gt;
  • 我在表述概念时犯了一个错误,已编辑。

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


【解决方案1】:

您可以为此嵌套折叠表达式:

template<typename... T>
requires ((C1<T> || C2<T>) || ...)
class A {};

另外,实际的概念应该是这样的:

template<typename T>
concept C1 = requires(T arg) {
    // something
};

【讨论】:

  • 很抱歉,我在表述概念时犯了一个错误(它不是可变参数),请参见上文。
  • @wimalopaan 好的,我修好了。下次小心点:)
  • 再抱歉一次。作品。但如果你像我一样使用函数式概念,请务必在折叠表达式的约束调用中包含 ()
  • @wimalopaan 不要这样。我宁愿使用即将成为官方的Concept TS :)
  • ((C1&lt;T&gt; || C2&lt;T&gt;) || ...) 否?
猜你喜欢
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
相关资源
最近更新 更多