条款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; }
相关文章推荐
- php 基本数据类型
- 二:Go编程语言规范-类型
- ASP.NET餐饮管理系统制作代码分享
- ThinkPHP中数据操作案例分析
- eclipse导入jar包的方式
- 关于PHPExcel的一些资料
- C++线程安全
- Java学习笔记【集合】
- php类和命名空间介绍,成员方法和类方法,类的继承与方法重写
- 编译安装php, Cannot find libmysqlclient under /usr
- Scala深入浅出进阶经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析及其在Spark中的应用源码解析
- Scala深入浅出进阶经典第67讲:Scala并发编程匿名Actor、消息传递、偏函数实战解析及其在Spark源码中的应用解析
- Java并发编程实践之Callable,Future,RutureTask的使用
- JAVA静态加载出错
- Scala深入浅出进阶经典第66讲:Scala并发编程实战初体验及其在Spark源码中的应用解析
- Java多线程基础知识(五)
- 【C语言】获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- Java中的substring真的会引起内存泄露么?
- 一:Go编程语言规范--块、声明、作用域
- C语言符号及关键字详解