前言:C++模板的演进
模板的演进是C++发展史中一条十分重要的线,个人觉得Concept是这条线中最大的一个特性了。在介绍Concept之前,我们先捋一捋模板这条线的发展。

据Stroustrup先生回忆, 对模板的设想早在1982年便有了,正式提出是在1998年的 USENIX C++ conference会议上提出,设计模板的初衷是因为当时的C++缺少一个标准库,而当时没有模板的C++很难设计出“vector、list”这种适用于多种类型的容器。
到1998年模板正式进入标准,在这之前C++模板已经是一个图灵完备的语言了——理论上来讲,可以只用模板代码解决任何可计算的问题。用递归实现循环、模板特化、偏特化实现分支判断。例如下面这个模板可以在编译期计算的fibonacci函数:
template<int N>
int fibonacci() {
return fibonacci<N-1>() + fibonacci<N-2>();
}
template<>
int fibonacci<1>() {
return 1; }
template<>
int fibonacci<0>() {
return 0; }
SFINAE特性为上述代码的运作提供了保障。两个模板的特化构造了递归的退出条件,“隐式”的实现了if判断的功能。到了C++17,有了if constexpr,上面这段代码可以写的更加“直白”
template<int N>
constexpr int fibonacci(){
if constexpr(N <= 1)
return N;
else
return fibonacci<N-1>() + fibonacci<N-2>();
}
auto val =

本文详细介绍了C++20中的Concept特性,它提供了一种更清晰、更精确的方式来约束模板参数,提高了代码可读性和编译错误提示的准确性。通过概念,可以避免模板实例化时的错误,简化std::enable_if等类型检查的复杂性,并且内置了多种常用概念,同时也支持自定义概念。Concept的使用包括require-clause、内置概念以及自定义概念的定义,为C++模板编程带来了重大改进。
最低0.47元/天 解锁文章
339

被折叠的 条评论
为什么被折叠?



