C++泛型編程:函數模板與類模板

泛型編程是一種語言機制,通過他可以實現一個標準的容器庫,可以處理不同的數據類型.
比如對棧的描述:
class stack
{
push(參數類型)//入棧
pop(參數類型)//出棧
}
由於上面的代碼與數據類型有關,可以通過模板實現一個代碼處理不同的數據類型。
首先執行一種通用的數據類型,不用具體指明哪一種。
class stack<參數模板 T>
{
push(T)//入棧
pop(T)//出棧
}
這裏的參數模板T相當於一個佔位符,當我們實例化類stack時,T會被具體的數據類型替換掉。

泛型在C++中的應用

泛型在C++中的主要實現爲模板函數和模板類。
通常使用普通的函數實現一個與數據類型有關的算法是很繁瑣的,比如兩個數的加法:

int add(int a,int b) { return a+b; }
float add(float a,float b) { return  a+b; }

雖然在C++中可以通過函數重載來解決這個問題,但是函數重載是靜態編譯,運行時佔用過多內存。
在此我們可以用C++的模板函數來表達通用型的函數,如下:

template<typename T> // 模板聲明
T add(T a,T b) { return a+b; }  // 注意形參和返回值的類型

這時C++編譯器會根據add函數的參數類型來生成一個與之對應的帶具體參數類型的函數並調用。

#include <iostream>
using namespace std;
template <typename T>
T add(T a,T b)  //注意形參和返回類型
{   
 return a+b;
} 
void main()
{
    int num1, num2, sum; 
    cin>>num1>>num2;
    sum=add(num1,num2); //用int匹配模版參數T,若sum,num1,num2類型不一致則無法匹配。
    cout<<sum;
}

函數模板的寫法

template <typename 模板參數列表>
函數返回類型 函數名(形參列表)
關鍵字template 和typename是必須的,typename可以使用關鍵詞class替換

  • 模板並不創建任何函數,而是告訴編譯器如何定義函數。
  • 函數模板不允許自動類型轉換。
  • 函數模板不可以設置默認模板實參。比如template 不可以。
  • 函數模板也可以向函數一樣進行重載。

類模板的寫法

//類聲明部分,有兩個模板參數T1,T2
template  <class T1, class T2 >  
class A {
   private:
   int a;
  T1 b;  //成員變量也可以用模板參數
  public: 
  int fun1(T1 x, int y );
 T2 fun2(T1 x, T2 y);
}
//類實現部分
template  <class T1, class T2 >
int A<T1>:: fun1(T1 x, int y ){//實現…… }
 template  <class T1, class T2 >
T2 A<T1,T2>:: fun2(T1 x, T2 y) {//實現…… }
 //使用類A
 int main( ) {
 //定義對象a,並用int替換T1, float替換T2
   A<int, float>  a;
   //實例化a,調用a的屬性和方法……
}

由上例可以看出, 類模板參數T1,T2對類的成員變量和成員函數均有效。
在C++編程中,當你要實現的一個類的某些成員函數和成員變量的算法跟數據類型有關,可以考慮用類模板,且C++版的數據結構算法大都用類模板實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章