为什么variadic模板在模板介绍中不起作用,但在requires-clause中工作? ConceptName {T,U,V,W}&lt; - template <typename ... t =“”>

时间:2018-01-19 12:29:53

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

我们有:

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无法使用模板介绍格式?

LIVE

1 个答案:

答案 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工作草案中。它可能会或可能不会以这种形式或其他方式添加。