模板(template)可以節省時間, 和避免代碼重復, 但是有可能導致代碼膨脹;
在設計模板時, 需要進行共性和變性分析(commonality and variability analysis), 把變性寫入模板, 把共性抽出來, 寫入其他模板,
然後通過調用的形式,避免代碼膨脹, 即是抽出模板參數無關的代碼.
可以設計一個基類, 使用私有(private)繼承的形式, 做為派生類的實現, 使用內聯(inline)的形式調用基類的函數.
基類使用函數參數或者私有成員變量的形式, 替換模板中的參數, 進行函數處理.
如以下代碼的中的invert()函數, 即與模板參數無關, 抽出在基類中進行實現.
代碼:
/* * test.cpp * * Created on: 2014.04.20 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include <boost/scoped_array.hpp> using namespace std; template <typename T> class SquareMatrixBase { protected: SquareMatrixBase(std::size_t n, T* pMem) : size(n), pData(pMem) {} void setDataPtr(T* ptr) { pData = ptr; } void invertBase() { std::cout << " pData[0] = " << pData[0]; std::cout << std::endl; } private: std::size_t size; T* pData; }; template <typename T, std::size_t n> class SquareMatrix : private SquareMatrixBase<T> { public: SquareMatrix() : SquareMatrixBase<T>(n, 0), pData(new T[n*n]) { this->setDataPtr(pData.get()); } void setData() { for (int i=0; i<n*n; ++i) pData[i] = 9; } void invert() { this->invertBase(); } private: boost::scoped_array<T> pData; }; int main() { SquareMatrix<int, 3> sm; sm.setData(); sm.invert(); SquareMatrix<int, 5> sm2; sm2.setData(); sm2.invert(); return 0; }
輸出:
pData[0] = 9 pData[0] = 9
作者:csdn博客 Spike_King