程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++:將參數無關的代碼抽離模板(templates)

C++:將參數無關的代碼抽離模板(templates)

編輯:關於C++

模板(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] = 9  
pData[0] = 9

作者:csdn博客 Spike_King

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved