函數(shù)模板

template<class T> //告訴編譯器 下面如果出現(xiàn)T不要報錯,T是一個通用類型,template<class T>等價于template<typename T>

自動類型推導,必須有參數(shù)類型才可以推導

例:

template <class T>
void mySwap(T& a, T& b)
{
    T tmp = a;
    a = b;
    b = tmp;
}
void test()
{
    int a = 10;
    int b = 20;
    //自動推導
    mySwap(a, b);

}

顯示指定類型

template <class T>
void mySwap(T& a, T& b)
{
    T tmp = a;
    a = b;
    b = tmp;
}
void test()
{
//指定類型
mySwap<int>(a,b);
}

模板必須要指定出T才可以使用

普通函數(shù)和函數(shù)模板的區(qū)別

普通函數(shù) 可以進行隱式類型轉換

函數(shù)模板不可以進行隱式類型轉換

函數(shù)模板和普通函數(shù)在一起調用規(guī)則:

  • 如果出現(xiàn)重載,優(yōu)先使用普通函數(shù)調用,如果普通函數(shù)沒有實現(xiàn),報錯。
template <class T>
void mySwap(T& a, T& b)
{
    T tmp = a;
    a = b;
    b = tmp;
}

void mySwap(int a, int b)
{
    int tmp = a;
    a = b;
    b = tmp;
}
void test()
{
int a=10;
int b=20;
//模板更好匹配,普通函數(shù)需要的是int型數(shù)據(jù)
mySwap(a,b);
}
  • 可以使用空模板實參列表的語法限定編譯時只能通過模板匹配
mySwap<>(a,b);//空參
  • 函數(shù)模板可以像普通函數(shù)那樣可以被重載
  • 如果函數(shù)模板可以產(chǎn)生一個更好的匹配,那么選擇模板
template <class T>
void mySwap(T& a, T& b)
{
    T tmp = a;
    a = b;
    b = tmp;
}

void mySwap(int a, int b)
{
    int tmp = a;
    a = b;
    b = tmp;
}
void test()
{
char a='a';
char b='b';
//模板更好匹配,普通函數(shù)需要的是int型數(shù)據(jù)
mySwap(a,b);
}

模板實現(xiàn)機制

  • 編譯器并不是把函數(shù)模板處理成能夠處理任何類型的函數(shù)
  • 函數(shù)模板通過具體類型產(chǎn)生不同的函數(shù)
  • 編譯器會對函數(shù)模板進行兩次編譯,在聲明的地方對模板代碼本身進行編譯,在調用的地方對參數(shù)替換后的代碼進行編譯

模板的局限性

模板不能解決所有的類型。

如果出現(xiàn)不能解決的類型,可以通過第三代具體化自定義數(shù)據(jù)類型,解決上述問題

如果具體化能夠優(yōu)先匹配,那么就選擇具體化

語法

template<> 返回值 函數(shù)名<具體類型>(參數(shù)...){}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容