模板分為函式模板和類模板。下面我們先來介紹函式模板.
1,函式模板:該函式與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別。
我們距離來說明函式模板的具體用法。
定義乙個實現加法功能的函式模板:
template t>//模板引數列表
t add(t left,t right)//函式模板
模板函式也可以定義為內聯函式,不過要注意inline只能放在模板引數列表之後,返回值之前。如:
templete t>
inline t add(t left,t right>
模板本身不是類或者函式,編譯器用模板產生特定型別的類或函式,產生特定型別的過程,稱為模板函式例項化。
template
t add(t left, t right)
int add(int left, int right)
int main()
執行結果為:
程式執行過程中,模板被編譯了兩次。
(1)在模板例項化之前,檢查模板本身是否出現語法錯誤
(2)在例項化期間。檢查模板**,看是否所有函式呼叫都有效。
模板形參名字只能在模板形參之後到模板宣告或定義的末尾之間使用,遵循名字遮蔽規則。
注意:
模板非型別形參:表示乙個固定型別的常量而不是乙個型別。只有整型,指標,引用才能作為非型別形參,而且繫結到該形參的實參必須是常量表示式。
下面介紹型別形參的轉換:
編譯器只會執行兩種轉換
(1)const轉換:接收const引用或const指標的函式可以分別用非const指標的函式或者指標來呼叫,不需要產生新的例項化。如果函式接收非引用型別,形參和實參都忽略const,即,無論傳遞const或非const物件給接受非引用型別的函式,都使用相同的例項化。
(2)陣列或函式到指標的轉換:如果模板形參不是引用型別。則對陣列或陣列型別的實參應用常規指標轉換。陣列實參將當做其指向第乙個元素的指標,函式實參當做指向函式型別的指標。
舉例說明:
template
const t& max(const t& left, const t& right)
int main()
我們來看看除錯過程:
注意到,const int& 轉換為int型
模板函式特化
有時候,通用模板定義函式可能對某些型別是錯誤的或者不能編譯,這時候就需要進行函式模板特化。我們先來看乙個反例:
本應該輸出1,結果卻是-1。這是因為這裡本應比較兩個字串的大小,編譯器卻只比較了兩個指標的位址大小。
如果再加上如下函式的定義:
template
<>
int compare
char*>(const
char* const p1,const
char* const p2)
我們再來看結果:
以上介紹的就是模板的特化。
下面介紹模板類
類模板也是模板,所以同樣需要template<>。
templateclass test//類模板
private:
t1 a;
t2 b;
};template<>//全特化
class test
int a;
char b;
};template//偏特化
class test
char a;
t2 b;
};int main()
列印結果如下:
C 類模板 函式模板全特化 偏特化的使用
一 類模板全特化 偏特化 pragma once include程式設計客棧 include template class tc void funtest template class tc void funtest template void tc funtest main.cpp include...
函式模板「偏特化」 (C )
模板是c 中很重要的乙個特性,利用模板可以編寫出型別無關的通用 極大的減少了 量,提公升工作效率。c 中包含類模板 函式模板,對於需要特殊處理的型別,可以通過特化的方式來實現特定型別的特殊操作。最近工作中,需要處理cont這種復合型別和t這種自定義型別的模板特化,因為cont型別有五種左右需要特殊處...
函式模板的特化
函式模板的特化 該定義中乙個或多個模板形參的實際型別或實際值是指定的。特化形式如下 關鍵字template後面接一對空的尖括號 再接模板名和一對尖括號,及括號中指定這個特化定義的模板形參 函式形參表 函式體 template int compare const char const v1,const...