2017-06-17 17 views
1

给出一个简单的variadoc模板应用约束的结合到一个参数包

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

以及两个或多个概念C1C2

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

如何申请的C1C2连词在A参数包的所有元素上,如:

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

以上不编译。我正在寻找一种方法来指定这个,而不用写一个像C1orC2这样的新概念。

+3

我觉得你刚刚你折表达式语法错误。它是'(C1 || ...)|| (C2 || ...)'。如果你的意思是参数包应该作为一个整体来应用'C1 || C2 ' –

+0

我在编制概念时犯了一个错误。 – wimalopaan

回答

3

可以通过嵌套折叠表达式是:

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

而且,实际的概念应该是这样的形式:

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

我很抱歉,但是我在制定概念时犯了一个错误(它不是可变的),请参阅上文。 – wimalopaan

+1

@wimalopaan好的,我修好了。下次再小心:) – Rakete1111

+0

对不起一次。作品。但是如果你使用像我这样的函数概念,一定要在fold表达式中约束的调用中包含'()'。 – wimalopaan