已经确认,在即将到来的c++20
标准中,根据最近Cologne ISO C++ Meeting中的this reddit report,我们将能够指定模板的,并且对于每个类/函数模板,我们将能够在其类型上设置。然而,在文档和教程(例如here)中,我找不到适用于多类型用例的正确语法。
假设我们有一个多类型的概念:
template<typename T1, typename T2>
concept AreEqComparable = requires(T1 a, T2 b) {
{ a == b } -> bool;
};
比方说,我想在两个不同类型之间定义一个简单的比较函数。我该怎么做呢?更具体地说,我应该在下面代码的???
部分写什么:
???
bool are_equal(T1 a, T2 b) { return a == b; }
我在here,here,甚至here上都找不到任何关于这个案例的引用。我随机尝试了一些东西,比如:
/* 1 */ template<AreEqComparable T1, T2>
/* 2 */ AreEqComparable<T1, T2>
/* 3 */ template<AreEqComparable<T1, T2>>
但是它们都抛出了语法错误。我认为答案应该在Bjarne Stroustrup的P0557规范中的某个地方,但我很快就找不到了。
发布于 2019-07-11 08:38:38
你可以这样写它:
template <typename T1, typename T2>
requires AreEqComparable<T1, T2>
bool are_equal(T1 a, T2 b)
{
// ...
}
这里,我们使用一个requires-子句对类型模板参数施加一个要求。
发布于 2019-07-11 16:20:08
你可以这样写:
template <typename T1, AreEqComparable<T1> T2>
bool are_equal(T1, T2);
这相当于:
template <typename T1, typename T2>
requires AreEqComparable<T2, T1>
bool are_equal(T1, T2);
在这里,类型在约束中翻转,是AreEqComparable<T2, T1>
而不是AreEqComparable<T1, T2>
。这对许多概念来说肯定很重要,但可能不是这个,因为==
本身在C++20中是对称的(除了不应该存在于实际代码中的病理情况)。如果你真的想确定这种对称性是有效的,你总是可以在概念中明确它(就像EqualityComparableWith
在工作草案中一样):
template<typename T1, typename T2>
concept AreEqComparable = requires(T1 a, T2 b) {
{ a == b } -> bool;
{ b == a } -> bool;
};
实际上,您可以通过颠倒模板参数的顺序(h/t Matthieu M),以正确的顺序获得所需的约束:
template <typename T2, AreEqComparable<T2> T1>
bool are_equal(T1, T2);
发布于 2019-07-12 01:38:23
还有一种完全避免引入模板参数的语法(以添加其他冗余为代价):
bool are_equal(auto x,auto y)
requires AreEqComparable<decltype(x),decltype(y)>
{return x==y;}
https://stackoverflow.com/questions/56980155
复制相似问题