template <typename T, size_t n>
class SquareMatrix
{
public:
void Invert();
};
int main()
{
SquareMatrix<int, 10> a;
SquareMatrix<int, 5> b;
}
在这个例子中,因为调用了使用了int,10和int,5为模版参数的SquareMatrix,所以会导致模版实例化出两个版本的invert
但此时invert只和10,5也就是矩阵size有关,和type无关。所以就像解决其他重复代码一样,把重复无关的部分提取出来成一个单独的class或者和函数。对应题目 《将与参数无关(type无关)的代码抽离templates》
所以提取后改造成以下
template <typename T>
class SquareMatrixBase
{
public:
void Invert(size_t size);
};
template <typename T, size_t n>
class SquareMatrix:private SquareMatrixBase<T>
{
public:
using SquareMatrixBase::invert(size_t);
void Invert(){
this->invert(n);
private:
T data[n*n];
}
};
这样改造之后
SquareMatrix<int, 10> a;
SquareMatrix<int, 5> b;
都共享同一个SquareMatrixBase<int>
然而这样做也是有着代价的
代价1.无法进行常量的编译优化
size是个编译期的常量,可以藉由常量的广传达到最优化
网友评论