1. 程式人生 > 實用技巧 >C++ - 模板

C++ - 模板

說明

  1. 模板雖然通用性很強,但是不能直接使用,它只是一個框架;並且並不是萬能的。(可以比喻成我們做PPT的時候)

  2. 泛型程式設計主要利用的技術就是模板。

  3. C++提供兩種模板機制:函式模板、類模板。

函式模板作用

建立一個通用函式,其函式返回值型別和形參型別可以不具體制定,用一個虛擬的型別來代表。

比如:

void func(int x)
    變成
T func(T x)

模板語法

寫一個函式模板(函式模板的語法):

template<typename/class T>
函式宣告或定義
  1. template:宣告建立模板

  2. typename/class:表面其後面的符號是一種資料型別,可以用class代替

  3. T-:通用的資料型別,名稱可以替換,通常為大寫字母

  4. 函式模板利用關鍵字template

  5. 使用函式模板有兩種方式:自動型別推導、顯示指定型別

  6. 模板的目的是為了提高複用性,將型別引數似

什麼時候會用到模板?舉例

首先,我們不考慮c++中的內建函式;然後交換兩個數,這兩個數可能是int、double、short等。如果我們不同資料型別都要寫一個函式的話,那麼將會非常多。所以這時候我們就需要用到模板。

template<typename T>
void swapp(T &x,T &y)
{
    T tmp=x;
    x=y;
    y=tmp;
}

int xx=1,yy=10;
// 使用模板交換

// 方法一:自動型別推導
swapp(xx,yy);

//方法二:顯示指定型別
swapp<int>(xx,yy); //這裡的int是指定T的資料型別

注意事項:

  1. 自動型別推導,必須推匯出一致的資料型別T,才可以使用
  2. 模板必須要確定出T的資料型別,才可以使用I
第二點錯誤示範程式碼:
template<typename T>
void w()
{
    cout<<"****"<<end;
}

int main()
{
    w(); // 會報錯
    // 正確:隨便給一個數據型別讓w可以執行起來
    // w<int>(); 正確
    return 0;
}

普通函式與函式模板區別

  1. 普通函式呼叫時可以發生自動型別轉換(隱式型別轉換)

  2. 函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換

  3. 利用顯示指定型別的方式,可以發生隱式型別轉換

#include<bits/stdc++.h>
using namespace std;

template<typename T>
T add(T a,T b)
{
    return a+b;
}

int w(int a,int b)
{
    return a+b;
}

int main()
{
    int a=1,b=2;
    char c='a'; // ASCII=97
    cout<<w(a,b)<<endl; // 3
    cout<<w(a,c)<<endl; // 98
    cout<<add(a,b)<<endl; // 3
//  cout<<add(a,c)<<endl;   這條語句這裡會報錯 如果是兩個char就不會報錯 嗎?
//函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換

    //不同型別利用模板,必須需要指定型別
    cout<<add<int>(a,b)<<endl; // 3
    cout<<add<int>(a,c)<<endl; // 98
    return 0;
}

普通函式與函式模板的呼叫規則

  1. 如果函式模板和普通函式都可以實現,優先呼叫普通函式

  2. 可以通過空模板引數列表( w<>(x,y) )來強制呼叫函式模板

  3. 函式模板也可以發生過載

4.如果函式模板可以產生更好的匹配,優先呼叫函式模板

說明一下:如果提供了函式模板,最好就不要提供普通函式,否則容易出現二義性。