将约束连接应用于参数包

时间:2017-06-17 05:29:45

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

给出一个简单的variadoc模板

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

以及两个或多个概念C1C2

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

如何在C1参数包的所有元素上应用C2A的连词,如:

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

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

1 个答案:

答案 0 :(得分:3)

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

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

此外,实际概念应采用以下形式:

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