C++ 将约束的连接应用于参数包

C++ 将约束的连接应用于参数包,c++,variadic-templates,c++-concepts,c++20,C++,Variadic Templates,C++ Concepts,C++20,给出了一个简单的文档模板 template<typename... T> class A {}; 如何在a的参数包的所有元素上应用C1和C2的连词,如: template<typename... T> requires C1<T>... || C2<T>... // nok class A {}; 模板 需要C1…||C2…//诺克 A类{}; 以上内容无法编译。我正在寻找一种方法来指定这一点,而无需编写新概念,如C1orC2您可以为

给出了一个简单的文档模板

template<typename... T>
class A {};
如何在
a
的参数包的所有元素上应用
C1
C2
的连词,如:

template<typename... T>
requires C1<T>... || C2<T>...     // nok
class A {};
模板
需要C1…||C2…//诺克
A类{};

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

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

template<typename... T>
requires ((C1<T> || C2<T>) || ...)
class A {};
模板
需要((C1 | | C2)| |……)
A类{};
此外,实际概念的形式应为:

template<typename T>
concept C1 = requires(T arg) {
    // something
};
模板
概念C1=要求(T参数){
//某物
};

我想您刚刚搞错了折叠表达式语法。它是
(C1 | |…)| |(C2 | |…)
。如果您的意思是参数包应该作为一个整体应用
C1 | | C2
我在制定概念时犯了一个错误,经过编辑。很抱歉,但我在制定概念时犯了一个错误(它不是可变的),请参见上面的内容。@wimalopaan好的,我修复了它。下次小心:)再次抱歉。作品但是如果您使用像我这样的函数概念,请确保在fold表达式中的约束调用中包含
()
。@wimalopan不要这样。我宁愿使用即将成为官方的:)或
((C1 | | C2)| |…)
否?
template<typename T>
concept C1 = requires(T arg) {
    // something
};