Item 44:将与参数无关的代码抽离templates

时间:2022-09-12 19:45:36

template为每一个模板参数生成一份代码,可能会造成代码膨胀。模板参数分为类型参数和非类型参数,通常非类型参数比较容易造成代码膨胀,例如下面一个例子:

template<typename T, std::size_t n>
class SquareMatrix{
public:
...
void invert(); //求逆矩阵
};
SquareMatrix<double, 5> sm1;
SquareMatrix<double, 10> sm2;
sm1.invert(); //调用SquareMatrix<double, 5>::invert
sm2.invert(); //调用SquareMatrix<double, 10>::invert

非类型参数就是这样轻易地造成了代码膨胀。
正确的做法类似这么一种思想:当你编写某一个函数时,而你明白其中的某一部分实现和另一个函数的代码本质相同,你会抽取出两个函数的共同部分,把它放入第三个函数里,然后令原先的两个函数调用这个新的函数
不过其实类型参数也会导致代码膨胀。例如在许多平台上,int和long有相同的二进制表述,所以像vector和vector的成员函数有可能完全相同,这正是膨胀的定义。又如,在大多数平台上,所有指针类型都有相同的二进制表述,因此凡template持有指针者(例如list