七、模板与泛型编程
条款44:将与参数无关的代码抽离templates
template
Template是节省时间和避免代码重复的一个奇妙的方法。
你只需要键入一个class template,剩下的就可以留给编译器去具现化那些相关类和函数。
- class templates的成员函数只有在被使用时才被暗中具现化,所以只有被具现化的所有函数都使用一遍,你才会获得所有函数。
Function templates也差不多,只需要写一个function template,然后就可以让编译器去干剩下的活了。
但是,使用templates可能会导致代码膨胀:其二进制码带着重复的代码、数据或两者都有。
所以,需要知道如何避免这样的错误 —— 共性与变性分析
- 对于函数:
分析两个函数,找出共同的部分和变化的部分,把共同的部分搬到一个新函数去,保留了两个函数,找出共同的部分和变化的部分,把共同部分搬到一个新函数去,保留变化的部分在原函数中不动。 - 对于类:
同函数,令原先的classes取用共同特性,而原classes的互异部分仍然在原位置不动。 - 对于template:
在non-template代码中,重复十分明确:你可以看到两个函数或两个classes之间有所重复;在template代码中,重复隐晦的,毕竟只存在一份template源码,所以必须训练自己去感受当template被具现化多次时可能发生的重复。
一个例子
想为固定尺寸的正方矩阵编写一个template。该矩阵的性质之一是支持矩阵的逆运算。
// template支持 n x n 矩阵,元素是类型为T的objects
template<typename