2017-06-17 48 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