您的位置:首页 > 编程语言

条款44:将与参数无关的代码抽离template

2015-09-27 16:12 369 查看
/*条款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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: