Effective C++(从templates中抽离无关的参数)


author:

  • luixiao1223
    title: 从templates中抽离无关的参数

代码膨胀

template<typename T, std::size_t n>
class SquareMatrix {
public:
    ...;
    void invert();
};

代码开始膨胀

SquareMatrix<double,5> sm1;
sm1.invert();
SquareMatrix<double,10> sm2;
sm2.invert();

第一次修改

template<typename T>
class SquareMatrixBase{
protected:
    void insert(std::size_t matrixSize);
};

template<typename T, std::size_t n>
class SquareMatrix:private SquareMatrixBase<T> {
    using SquareMatrixBase<T>::invert;
public:
    void invert(){invert(n);}
};

注意这里可以解决传递参数的问题,但是另一个问题也浮现.基类如何能访问到继承类的数据呢?要计算逆矩阵就需要访问继承类的矩阵数据.

把指针也作为参数传递进来.

template<typename T>
class SquareMatrixBase {
protected:
    SquareMatrixBase(std::size_t n, T *pMem)
        : size(n), pData(pMem) {}
    void setDataPtr(T *ptr) { pData = ptr; }
    ...;
private:
    std::size_t size;
    T *pData;
};

template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
public:
    SquareMatrix()
        : SquareMatrixBase<T>(n, data) {} //把指针数据传递进去
private:
    T data[n*n];
};

也许派生类是动态内存

template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
public:
    SquareMatrix()
        :SquareMatrixBase<T>(n,0),
         pData(nw T[n*n])
    {this->setDataPtr(pData.get());}
private:
    boost::scoped_array<T> pData;
};

缺点

指针失去封装,对于管理指针带来风险和复杂性.比如你要如何判断处于派生类拥有的指针是否已经被删除了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值