那时我还年轻,没有意识到这个世界到底有多么深刻而复杂。
模板,可以理解为函数的函数,或类的类,当你学习过时变泛函这门课程之时,将会对模板有更为深入的理解。
模板基本语法总结
模板定义及嵌套模板
模板的定义以关键字template
开始,后面跟一个模板参数列表,其实和函数列表差不多,也可以有默认的模板类型参数(C++11新增功能)。需要注意的是,如果有嵌套的模板参数列表,那么都需要添加typename
关键字,因为如果把模板列表视为一个函数参数列表,那么这个参数列表中应该只是代表抽象的参数类型,而非具体的某个值,所以都要添加typename
表示抽象的类型。
1 | template<class T, class Sequence = vector<T>, // 默认模板参数为vector<T>类型 |
在上面这个代码中,有一点很令人困惑,即less<typename Sequence::value_type>>
,为什么要加typename
呢?不加可以吗?答案是不行,这里的一个原因是C++的编译器无法区分Sequence::value_type
到底是一个类型,还是Sequence下的一个成员变量。实际上,Sequence::value_type
是一个嵌套从属类型(从属于模板参数Sequence),为了消除二义性,我们必须明确告知编译器,这是一个模板类型,所以需要添加typename。