模板(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