C++20 概念的用例是什么?
What are the use cases of C++20 Concepts?
我在查看 C++20 功能时发现了概念。我发现他们为模板参数添加了验证,但除此之外我不明白 C++20 概念的真实世界用例是什么。
C++ 已经有类似 std::is_integral
的东西,它们可以很好地执行验证。
我确定我遗漏了一些有关 C++20 概念及其支持的内容。
SFINAE(参见 here & here)是意外的图灵完备子语言,它在重载解析和模板专业化选择时执行。
事实证明它在模板代码中被大量使用。
概念和 require 子句是尝试利用意外有用的语言特性并使其变得不那么糟糕。
概念的起源本来有3个; (a) 以简洁的方式描述给定的模板代码位需要什么,(b) 还提供一种映射其他类型以满足这些要求的非侵入式方式,以及 (c) 检查模板代码,以便任何类型满足概念保证编译
(a) 和 (c) 的所有尝试都失败了,通常需要永远编译 and/or 限制了您可以使用 (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
有。在概念之前执行此操作是一项烦人的工作,甚至将规范添加到标准中也是如此。
这是图灵tar的坑;一切都是等价的,但没有什么是容易的。所有程序都可以用 I/O 加上一条 (a=(a-b);(a<0)?goto c:next
3 参数指令来编写;但是更丰富的语言可以让程序变得不那么糟糕。 Concepts 采用了 C++ 的一个深奥分支 SFINAE,并使它更简洁(因此更多人可以利用它),并改进了错误消息。
我在查看 C++20 功能时发现了概念。我发现他们为模板参数添加了验证,但除此之外我不明白 C++20 概念的真实世界用例是什么。
C++ 已经有类似 std::is_integral
的东西,它们可以很好地执行验证。
我确定我遗漏了一些有关 C++20 概念及其支持的内容。
SFINAE(参见 here & here)是意外的图灵完备子语言,它在重载解析和模板专业化选择时执行。
事实证明它在模板代码中被大量使用。
概念和 require 子句是尝试利用意外有用的语言特性并使其变得不那么糟糕。
概念的起源本来有3个; (a) 以简洁的方式描述给定的模板代码位需要什么,(b) 还提供一种映射其他类型以满足这些要求的非侵入式方式,以及 (c) 检查模板代码,以便任何类型满足概念保证编译
(a) 和 (c) 的所有尝试都失败了,通常需要永远编译 and/or 限制了您可以使用 (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
有。在概念之前执行此操作是一项烦人的工作,甚至将规范添加到标准中也是如此。
这是图灵tar的坑;一切都是等价的,但没有什么是容易的。所有程序都可以用 I/O 加上一条 (a=(a-b);(a<0)?goto c:next
3 参数指令来编写;但是更丰富的语言可以让程序变得不那么糟糕。 Concepts 采用了 C++ 的一个深奥分支 SFINAE,并使它更简洁(因此更多人可以利用它),并改进了错误消息。