【问题标题】:What are the use cases of C++20 Concepts?C++20 概念的用例有哪些?
【发布时间】:2021-05-08 21:03:58
【问题描述】:

我在查看 C++20 特性时发现了 Concepts。我发现他们为模板参数添加了验证,但除此之外,我不明白 C++20 概念的真实用例是什么。

C++ 已经有了std::is_integral 之类的东西,它们可以很好地执行验证。

我确定我遗漏了一些关于 C++20 概念及其功能的内容。

【问题讨论】:

  • 概念是 SFINAE 的语法糖。它们不允许以前不可能的任何事情,但它们使完成 SFINAE 的语法更加更可口。
  • 考虑named requirements。从某种意义上说,概念从一开始就存在,但直到现在它们才成为一等公民
  • @PatrickRoberts 它们有助于避免 SFINAE,但它们不是它的语法糖。 if constexpr 对此也有帮助。
  • @PatrickRoberts 他们确实允许在可变参数模板构造函数上实现以前不可能的事情,例如 SFINAE,从而禁用非模板方法或概念合并。

标签: c++ c++20 c++-concepts


【解决方案1】:

SFINAE 是一种意外的图灵完备子语言,它在重载决议和模板特化选择时执行。

原来它在模板代码中被大量使用。

Concepts 和 requires 子句试图利用这种意外有用的语言特性并使其不那么糟糕。

概念的起源将有 3 个部分; (a) 以简洁的方式描述给定模板代码所需的内容,(b) 还提供了一种映射其他类型以满足这些要求的方法,并且 (c) 检查模板代码,以便任何类型满足概念保证编译

(a)加(c)的所有尝试都失败了,通常需要永远编译和/或限制您可以使用(a)检查的内容。 (b) 也被删除以确保 (a) 更好;在很多情况下,你可以手动编写这样的概念图机制,但 C++ 并没有为你提供。

那么,现在它有什么用呢?

auto sum( Addable auto... values )

使用Addable的概念来简洁的表达一个模板的接口。传递不可添加的突出显示时收到的错误消息不是Addable,并且表达式不起作用。

template<class T, class A>
struct vector{
  bool operator==(vector<t,A>const& o)requires EquallyComparible<T>;
};

在这里,我们声明这个向量有一个== 当且仅当T 有。在概念之前这样做是一件烦人的事情,甚至将规范添加到标准中也是如此。

这是图灵焦油坑;一切都是等价的,但没有什么是容易的。所有程序都可以用 I/O 加上(a=(a-b);(a&lt;0)?goto c:next 3 参数指令编写;但是更丰富的语言会使程序变得更少。 Concepts 采用 C++ 的一个深奥分支 SFINAE,使其简洁明了(因此更多人可以利用它),并改进了错误消息。

【讨论】:

  • +1 用于提及更清晰的错误消息。这是 Stroustrup(和同事)投入大量精力将概念引入标准的主要原因,它不仅仅是围绕 SFINAE 的“单纯”语法糖。
  • @largest_prime_is_463035818 我认为他很快。请参阅之前的编辑。可能是竞争条件;)
  • @jeffbRTC 通常不需要 cmets 来处理这种简单的错别字。我只是不确定我是否理解一开始写的内容
  • @largest 我经常在禁用自动更正(因为自动更正和代码很烂)和愚蠢的小键盘的手机上写这些,所以我可以使用 ctrl/alt/箭头键/等。错别字。然后我重新阅读并修复错别字。在这种情况下,我也是在第一次重读之前提前提交的,在我写完之前,所以很多垃圾都通过了。
猜你喜欢
  • 1970-01-01
  • 2021-07-12
  • 2023-03-28
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
相关资源
最近更新 更多