1、模板的表示:template<class C>
2、typedef可以缩短由模板生成的长名字。
3、模板类中的成员的声明与非模板类里完全一样。模板类的成员也不必在类本身的内部定义,在这种情况下,它必须出现在某个地方,像非模板类的成员一样。模板类的成员本身也是模板参数化的,与它们所在的模板类的参数一样。在类外定义这些成员时,就必须显式地将它们定义为模板。
4、从一个模板类和一个模板参数生成一个类声明的过程通常称为模板实例化。针对一个特定模板参数的模板版本被称为是一个专门化。
5、模板可以有类型参数,可以有常规类型的参数如int,还可以有模板参数。一个模板可以有多个参数。模板参数可以是常量表达式,具有外部连接的对象或者函数的地址,或者非重载的指向成员的指针。用做模板参数的指针必须具有&of的形式,其中,of是对象或者函数的名字;或者具有f的形式,f必须是一个函数名。到成员的指针必须具有&X::of的形式,这里的of是一个成员名。
6、函数模板
在调用模板函数时,函数参数的类型决定到底应使用模板的哪个版本。
编译器能够从一个调用推断出类型参数和非类型参数,条件是由这个调用的函数参数表能够唯一的标识出模板参数的一个集合。如果不能从模板函数的参数推断出某个模板参数,就必须显式的去描述它。显式描述的最常见用途是为模板函数提供返回值类型。
重载解析规则保证模板函数能够正确地与继承机制相互作用。
用模板参数描述策略。
7、专门化是为在一个类的不同实现之间做隐式选择而提供的一种机制。
对于一个模板的可以互相替代的定义称为用户定义的专门化。
template<> class name<type>
8、派生与模板
模板和派生都是从已有类型构造新类型的机制,通常都用于写利用各种共性的代码。
9、参数化与继承
虚函数提供的东西称作运行时多态,而把模板提供的称为编译时多态或者参数式多态性。如果在这些对象间并不需要某种层次性的关系,那么最好是将它们作为模板的参数。如果在编译时无法确定这些对象的类型,那最好是将它们表示为一个公共抽象类的许多派生类。
10、成员模板
成员模板不能是virtual。因为,每次用一个新的实参类型去调用时,连接程序就必须向类的虚表里加入一个表项。
一个模板的模板函数表不能与其模板成员的模板参数表组合在一起。?????
11、源代码组织
在使用模板的编译单位最前面包含(include)有关模板的定义。
只在使用模板的编译单位最前面包含(include )有关模板的声明,并且分别编译它们的模板定义。
非inline的static成员都必须在某个编译单位里有唯一的定义,也就是说,在那些需要包含到多个编译单位里去的模板里最好不要使用这种成员。