模板能够直接支持通用型程序设计,即直接采用类型作为参数的程序设计。templates是节省时间和避免代码重复的极好方法,我们可以只输入一个类模板,就能让编译器实例化所需要的很多个特定类及函数。
1、声明的作用域。C的作用域延伸到由template<class C>作为前缀的声明的结束处。
这就是我们写一个类模板时,在类的声明之前写入template<class C>。在类外定义类的成员函数时又需要在函数实现之前写入template<class C>的原因。
2、typename和class的区别。
简单点,typename用来说明一个qualified name是一个类型,在模板定义时的class和typename是没有区别的。
3、隐式类型推测转换。
编译器能够从一个调用中推测出类型参数和非类型参数,只要这个调用的函数参数表能够唯一地标识出模板参数的一个集合。但编译器不会对类模板的参数做任何推测。
4、函数模板重载。
多个函数模板可以具有相同的名字,也可以声明具有统一名字的多个函数模板与常规函数的组合。编译器根据一系列判定规则,选取一个适合的,或者更优的模板函数进行实例化。当产生歧义,找不到匹配时,是一个错误。
5、默认模板参数
C++支持默认参数,模板当然也可以。但默认的模板参数只有在不提供参数时,才进行语义检查。也就是说只有在使用时,才进行语义检查。
6、template<>
template<>前缀说明这是一个专门化,可以不用模板参数描述。C++默认方式一般对模板函数建立代码段的副本,很容易导致严重的代码膨胀。使用此技术可以有效减少代码长度。
7、模板和派生类
如果运行时的效率非常重要,那么最好使用模板而不是派生类。如果增加新功能而又不重新编译很重要,最好使用派生类而不是模板。如果无法定义公共基类,最好用模板而不是派生类。当有兼容性约束的内部类和结构非常重要时,最好使用模板而不是派生类。
最近被问到模板的缺点,也讨论下这个问题吧。
1、模板可能引起代码膨胀。带有类型参数的模板在实例化时,可能生成多个代码块,引起代码膨胀。
2、调试困难。模板提供了编译期多态,编译之前进行了参数实例化。还没有存在一个IDE能够对模板进行断点调试。
3、模板不能像链接库那样被广泛使用。模板的数据类型只能在编译时才能被确定。因此,所有用基于模板算法的实现必须包含在整个代码的头文件中。