在回顾C++20特性时,我发现了关于概念。我发现它们为模板参数添加了验证,但除此之外,我不理解C++20概念的真实用例是什么。
C++已经有了像std::is_integral这样的东西,他们可以很好地执行验证。
我确信我遗漏了一些关于C++20概念和它所支持的东西。
发布于 2021-05-09 05:18:06
SFINAE是一种意外的图灵完全子语言,它在重载解析和模板专门化选择时执行。
事实证明,它在模板代码中使用得很多。
Concept和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<0)?goto c:next 3参数指令来编写;但是更丰富的语言会让程序变得不那么糟糕。Concept采用了C++的一个深奥的分支SFINAE,并使其干净和简单(以便更多的人可以利用它),并改进了错误消息。
https://stackoverflow.com/questions/67452122
复制相似问题