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

Factor parameter-independent code out of templates.

使用 templates 可能会导致代码膨胀(code bloat):其二进制码带着重复的代码、数据,或两者。

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

SquareMatrix<double, 5> sm1;
SquareMatrix<double, 10> sm2;    // 具现化出两个 SquareMatrix

对于因非类型模板参数(non-type template parameters)而造成的代码膨胀,可以进行消除:

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

对于因类型参数(type parameters)而造成的代码膨胀,往往可以降低,例如用基类中的指针记录数据存放的位置,替代了每次向 derived class 询问的操作:

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

Last updated

Was this helpful?