模板每種具現化型別都會產生完整程式碼,導致程式碼膨脹。若部分邏輯與模板參數無關,應提取至非模板基類別。
/* test.cpp
* Created on: 2014.04.20
* Author: Spike
*/
#include <iostream>
#include <boost/scoped_array.hpp>
using namespace std;
template <typename T>
class SquareMatrixBase {
protected:
SquareMatrixBase(size_t n, T* pMem) : size(n), pData(pMem) {}
void setDataPtr(T* ptr) { pData = ptr; }
void invertBase() { cout << " pData[0] = " << pData[0] << endl; }
private:
size_t size;
T* pData;
};
template <typename T, size_t n>
class SquareMatrix : private SquareMatrixBase<T> {
public:
SquareMatrix() : SquareMatrixBase<T>(n, nullptr), 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();
}
pData[0] = 9
pData[0] = 9
invertBase 非模板函式,僅產生一份程式碼,所有具現化共用。inline 轉發消除呼叫開銷。