條款44:將與參數無關的代碼抽離template

/*條款44:將與參數無關的代碼抽離template*/
//共性與變性分析,把兩個類或函數中本質相同的代碼進行抽離成另一個相同類別的結構中
//在模板代碼中,重複的部分是隱晦的
//下面是一個支持矩陣運算的例子
#include<iostream>
#include<boost/lambda/lambda.hpp>
using namespace std;
/*
template<typename T,std::size_t n>
class SquareMatrix{
public:
	//..
	void invert();//求逆矩陣
};
//經過下主函數裏的兩個調用你可能把上面的代碼改寫這樣,進行抽離

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;//避免遮掩base版本的invert
public:
	void invert(){
		this->invert(n);	
	}

};
// 另一種辦法是基類中貯存一個指針,指向矩陣數值所在的內存,這種做法可能對象自身非常大
template<typename T>
class SquareMatrixBase{
protected:
	SquareMatrixBase(std::size_t n,T*pMem):size(n),pData(pMem){}
	void setDatePtr(T*ptr){
		pData = ptr;	
	}
	//..
private:
	std::size_t size;
	T*pData;
};
template<typename T,std::size_t n>
class SquareMatrix:private SquareMatrixBase<T>{
public:
	SquareMatrix():SquareMatrixBase<T>(n,data){
			
	}
	//...
private:
	T data[n*n];
};*/
// 另一種做法是把每一個矩陣的數據放進heap(也就是通過new來分配內存)
template<typename T>
class SquareMatrixBase{
protected:
	SquareMatrixBase(std::size_t n,T*pMem):size(n),pData(pMem){}
	void setDatePtr(T*ptr){
		pData = ptr;	
	}
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());	
	}
	//..
private:
	boost::scoped_array<T> pData;
}
int main(){
	SquareMatrix<double,5>sm1;//5×5的矩陣
	//..
	sm1.invert();
	SquareMatrix<double,10>sm2;//10*10的矩陣
	//..
	sm2.invert();
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章