条款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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值