概念定义中的多个模板参数

时间:2019-02-08 13:18:18

标签: c++ c++-concepts

我有一个包含多个模板参数的概念

template<typename T, typename U> EqualityComparable

我可以在

中使用它吗?
template< EqualityComparable T /* and U */ > void foo() {}

以某种方式?

作为示例,请考虑以下代码段

template <typename T, typename U>
concept EqualityComparable = requires(T a, U b) {
        {a == b} -> bool;
        {a != b} -> bool;
};

template<EqualityComparable T /* and U */>
void foo (T,U) {} //can i make this work?

int main () {
    foo(1.0f,1);
}

godbolt上的clang实验概念编译器告诉我

template<EqualityComparable T /* and U */> void foo(T,U) {}

--> error: concept 'EqualityComparable' requires more than 1 template argument; provide the remaining arguments explicitly to use it here

所以这似乎暗示可能吗?

2 个答案:

答案 0 :(得分:2)

这是可能的

template<typename A, typename B> requires EqualityComparable<T,U>
void foo_works(T,U) {}

但是我想知道它是否可以直接在template<>

中工作

答案 1 :(得分:1)

我认为这应该可行:

template<class T>
void foo_works(T, EqualityComparable<T> auto);

或等效地:

template<class T, EqualityComparable<T> U>
void foo_works(T,U);

它将具有理想的效果,但是在编写时它并不能反映EqualityComparable概念的对称性。

因此,某些编码人员可能更喜欢将非缩写语法用于对称的约束:

template<class T,class U>
   requires EqualityComparable<T,U>
void foo_works(T,U);

使用TS概念,就有这种可能性:

EqualityComparable{T,U}
void foo_works(T,U);

但是这种语法让保守派感到害怕。