NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
## 条款44:将与参数无关的代码抽离 templates Factor parameter-independent code out of templates. 使用 templates 可能会导致代码膨胀(code bloat):其二进制码带着重复的代码、数据,或两者。 ```cpp 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)而造成的代码膨胀,可以进行消除: ```cpp 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 询问的操作: ```cpp 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; }; ```