我们有:
template <typename ...T> concept bool Numerics = ( std::is_arithmetic_v<T> && ... ) ;
template <typename T> concept bool Numeric = std::is_arithmetic_v<T>;
因此我们可以使用如下所示的require子句来应用类型约束:
template <typename T, typename U, typename V, typename W> requires Numerics<T,U,V,W>
auto foo(T arg1, U arg2, V arg3, W arg4) {
return arg1 + arg2 + arg3 + arg4;
}
但是我们不能写这样的模板介绍格式:
// err: no match concept
//
// Numerics{T,U,V,W}
// auto foo2(T arg1, U arg2, V arg3, W arg4) {
// return arg1 + arg2 + arg3 + arg4;
// }
必须明确定义固定数量的参数:
template <typename T, typename U, typename V, typename W>
concept bool Numeric4 = Numerics<T,U,V,W>;
Numeric4{T,U,V,W}
auto foo3(T arg1, U arg2, V arg3, W arg4) {
return arg1 + arg2 + arg3 + arg4;
}
在require-clause中工作时,为什么template <typename ...T> concept
无法使用模板介绍格式?
答案 0 :(得分:1)
首先,请注意此语法已从其latest draft中的Concepts TS中删除。
在previous draft中,此语法在[temp.intro]中定义并且定义明确:
Numerics{T,U,V,W}
auto foo2(T arg1, U arg2, V arg3, W arg4) {
return arg1 + arg2 + arg3 + arg4;
}
对于每个介绍参数,应该按照其模式调整Numerics
中的参数包,并根据该模式声明模板参数。所以这应该等同于:
template <typename T, typename U, typename V, typename W> // per [temp.intro]/2
requires Numerics<T,U,V,W> // per [temp.intro]/5
auto foo2(T arg1, U arg2, V arg3, W arg4) {
return arg1 + arg2 + arg3 + arg4;
}
本节还有其他例子说明这应该有效。按照这个草案,代码格式正确。
即如前所述,语法已从TS中删除,并未出现在C ++ 20工作草案中。它可能会或可能不会以这种形式或其他方式添加。