模板

那时我还年轻,没有意识到这个世界到底有多么深刻而复杂。

模板,可以理解为函数的函数,或类的类,当你学习过时变泛函这门课程之时,将会对模板有更为深入的理解。

模板基本语法总结

模板定义及嵌套模板

模板的定义以关键字template开始,后面跟一个模板参数列表,其实和函数列表差不多,也可以有默认的模板类型参数(C++11新增功能)。需要注意的是,如果有嵌套的模板参数列表,那么都需要添加typename关键字,因为如果把模板列表视为一个函数参数列表,那么这个参数列表中应该只是代表抽象的参数类型,而非具体的某个值,所以都要添加typename表示抽象的类型。

1
2
3
template<class T, class Sequence = vector<T>,      // 默认模板参数为vector<T>类型
class Compare = less<typename Sequence::value_type>> // 默认模板参数为Sequence::value_type,必须加typename
class priority_queue{...};

在上面这个代码中,有一点很令人困惑,即less<typename Sequence::value_type>>,为什么要加typename呢?不加可以吗?答案是不行,这里的一个原因是C++的编译器无法区分Sequence::value_type到底是一个类型,还是Sequence下的一个成员变量。实际上,Sequence::value_type是一个嵌套从属类型(从属于模板参数Sequence),为了消除二义性,我们必须明确告知编译器,这是一个模板类型,所以需要添加typename。

参考文献

0%