C++:将参数无关的代码抽离模板(templates)2014-11-14模板(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] = 9pData[0] = 9
作者:csdn博客 Spike_King