首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++20:多类型的概念及其约束,正确的语法?

C++20:多类型的概念及其约束,正确的语法?
EN

Stack Overflow用户
提问于 2019-07-11 08:21:35
回答 4查看 2.7K关注 0票数 22

已经确认,在即将到来的c++20标准中,根据最近Cologne ISO C++ Meeting中的this reddit report,我们将能够指定模板的,并且对于每个类/函数模板,我们将能够在其类型上设置。然而,在文档和教程(例如here)中,我找不到适用于多类型用例的正确语法。

假设我们有一个多类型的概念:

代码语言:javascript
复制
template<typename T1, typename T2>
concept AreEqComparable = requires(T1 a, T2 b) {
    { a == b } -> bool;
};

比方说,我想在两个不同类型之间定义一个简单的比较函数。我该怎么做呢?更具体地说,我应该在下面代码的???部分写什么:

代码语言:javascript
复制
???
bool are_equal(T1 a, T2 b) { return a == b; }

我在herehere,甚至here上都找不到任何关于这个案例的引用。我随机尝试了一些东西,比如:

代码语言:javascript
复制
/* 1 */ template<AreEqComparable T1, T2>
/* 2 */ AreEqComparable<T1, T2>
/* 3 */ template<AreEqComparable<T1, T2>>

但是它们都抛出了语法错误。我认为答案应该在Bjarne StroustrupP0557规范中的某个地方,但我很快就找不到了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-07-11 08:38:38

你可以这样写它:

代码语言:javascript
复制
template <typename T1, typename T2>
    requires AreEqComparable<T1, T2>
bool are_equal(T1 a, T2 b)
{
    // ...
}

这里,我们使用一个requires-子句对类型模板参数施加一个要求。

票数 16
EN

Stack Overflow用户

发布于 2019-07-11 16:20:08

你可以这样写:

代码语言:javascript
复制
template <typename T1, AreEqComparable<T1> T2>
bool are_equal(T1, T2);

这相当于:

代码语言:javascript
复制
template <typename T1, typename T2>
    requires AreEqComparable<T2, T1>
bool are_equal(T1, T2);

在这里,类型在约束中翻转,是AreEqComparable<T2, T1>而不是AreEqComparable<T1, T2>。这对许多概念来说肯定很重要,但可能不是这个,因为==本身在C++20中是对称的(除了不应该存在于实际代码中的病理情况)。如果你真的想确定这种对称性是有效的,你总是可以在概念中明确它(就像EqualityComparableWith在工作草案中一样):

代码语言:javascript
复制
template<typename T1, typename T2>
concept AreEqComparable = requires(T1 a, T2 b) {
    { a == b } -> bool;
    { b == a } -> bool;
};

实际上,您可以通过颠倒模板参数的顺序(h/t Matthieu M),以正确的顺序获得所需的约束:

代码语言:javascript
复制
template <typename T2, AreEqComparable<T2> T1>
bool are_equal(T1, T2);
票数 13
EN

Stack Overflow用户

发布于 2019-07-12 01:38:23

还有一种完全避免引入模板参数的语法(以添加其他冗余为代价):

代码语言:javascript
复制
bool are_equal(auto x,auto y)
  requires AreEqComparable<decltype(x),decltype(y)>
  {return x==y;}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56980155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档