概念定义中的多个模板参数
multiple template parameters in concept definition
我有一个包含多个模板参数的概念
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<typename A, typename B> requires EqualityComparable<T,U>
void foo_works(T,U) {}
但我想知道它是否可以直接在 template<>
我认为这应该可行:
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);
但这种语法吓坏了保守派。
我有一个包含多个模板参数的概念
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<typename A, typename B> requires EqualityComparable<T,U>
void foo_works(T,U) {}
但我想知道它是否可以直接在 template<>
我认为这应该可行:
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);
但这种语法吓坏了保守派。