我在回顾 C++20 功能时发现了 Concepts。我发现他们为模板参数添加了验证,但除此之外我不明白 C++20 概念的真实用例是什么。
C++ 已经有了类似的东西std::is_integral
他们可以很好地执行验证。
我确信我错过了有关 C++20 概念及其功能的一些内容。
SFINAE(参见here & here)是一种意外的图灵完备子语言,在重载决策和模板专业化选择时执行。
事实证明它在模板代码中被大量使用。
概念和要求子句试图利用意外有用的语言功能并使其变得不那么糟糕。
概念的起源将分为三部分: (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<0)?goto c:next
3参数指令;但更丰富的语言可以让程序变得不那么糟糕。 Concepts 采用了 C++ 的一个深奥分支 SFINAE,并使其变得干净、简单(以便更多的人可以利用它),并改进了错误消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)