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

multiple template parameters in concept definition

本文关键字:参数 定义      更新时间:2023-10-16

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

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

所以这似乎表明这是可能的吗?

我认为这应该有效:

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

或等效:

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

它将具有预期的效果,但正如它所写的那样,它并没有反映平等可比概念的对称性。

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

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

对于 TS 概念,存在这种可能性:

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

但这种语法吓坏了保守派。

这是一种可能性

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

但我想知道它是否直接在template<>中起作用