程序员

《effective c++阅读笔记》条款44:将与参数无关的代

2020-05-02  本文已影响0人  JimmyPan
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是个编译期的常量,可以藉由常量的广传达到最优化

上一篇下一篇

猜你喜欢

热点阅读