前言: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>();