1 专门化。
实际使用证明,这种技术在抑制代码膨胀方面非常有效。没有使用类似技术的人们常常发现,即使对中等规模的程序,代码副本也可能消耗掉成M的字节的代码空间。这一技术还能清除编译额外的向量操作版本所需的时间,从而大大提高编译和链接速度。用一个专门化去实现所有指针的表可以作为例子,说明一种通过最大限度代码共享达到最少的代码膨胀的一般性技术。
NOTES:
通用模板必须在专门化之前声明。
template<calss T> class List<T*>{};
template<classT> class List{}//error.
一个模板的所有专门化和这个模板本身必须在同一个名字空间里声明。
2 派生和模板
模板和派生都是从已有类型构造欣类型的机制,通常都是被用于去写利用各种共性的代码。这两种机制的组合式许多有用技术的基础。
从一个非模板类派生冲一个模板类,这是为一个模板提供一个共同实现的一种方法。
如:
template <class T> class Vector<T*>:"private Vector<void *>{};
3 参数化和继承
将虚函数提供的东西称作运行时多态性,而把模板提供的称作编译时多态性或者参数式多态性。关于什么时候运用?
如果在这些对象间并不需要某种层次性的关系,那么最好是将他们作为模板的参数。如果在编译时无法确知这些对象的类型,最好将他们表示为一个公共抽象类的许多派生类。如果对运行时效率的要求特别严格,也就是说,必须将各种操作在线化,那么就应该使用模板。
4 源代码组织
为了使其他编译单位能够访问,就必须将这个模板定义显式地声明为export,方式是为了定义或者定义之前的某个声明加上关键字export。如果没有这样做,在任何地方使用模板,都将要求他的定义必须位于作用域中。