c++中分為函式模板和類模板,它們之間的相同點是都含有模板型參表,不同點在模板例項化的時候函式模板可以不用顯示的宣告模板類項,編譯器會自動幫我們匹配,而類模板則需要顯示定義出來,例如:
template compare(type& , type&); compare(a,b);
template class queue class test;
1.函式模板中編譯器幫我們做了例項化的事情,那麼它遵循的是什麼規則呢?
首先,編譯器首先考慮產生新的例項,而不是轉化實參以匹配已有的例項化,以上 面compare為例:
int a1= 3,a2 = 4;
long b1 = 3,b2 = 4;
compare(a1,a2);
compare(b1,b2);
編譯器首先例項化乙個compare(int,int),當遇到b1,b2時,不會考慮對b1,b2進行類 項轉化,而是又例項化了乙個 compare(long,long).
但是也有例外,編譯器會在以下兩中情況下執行轉化而不去產生新的類項:
1>. const轉換,既你可以把非const類項物件的引用或指標傳到接受const類項的函式中而不產生例項化,或者傳遞物件給接受非引用類項的函式時也不會產生例項化。
2>.陣列或函式到指標的轉化;
2.函式模板的顯式實參
有時候我們不確定模板實參的類項,如:
template??? sum(t,u) ,我們想要返回t,u類項中範圍最大的那個,該怎麼辦呢?
一種是指定顯示模板引數,如sum(static_castshort, int),既把小範圍的給強制轉換成範圍大的類項。
還有一種是在返回類項中再使用類項行參,如:
templatet sum(u,k);
long val = sum(int ,long);
3.函式模板特化
有時候模板函式並不能幫我們解決所有問題,比如compare函式,當我想比較指向字串的指標時,很顯然我想比較的是字串的字典序,而不是兩個指標的大小,這個時候就需要我們用模板特化的技術了。
模板特化的格式是這樣的:
template<> int compare(const char* const , const char* const )
我的理解就是把模板引數列表從template移到了後面,同時模板特化是不支援類項轉化的,傳入的引數類項必須完全匹配,如果不匹配的化,它會去普通模板中檢視是否能夠例項化。
C 模板之函式模板
泛型程式設計 編寫與型別無關的邏輯 是 復用的一種手段。模板是泛型程式設計的基礎 模板代表乙個函式家族,該函式與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本 它本身不是類或函式 模板函式的格式 模板的例項化 產生模板特定型別的過程稱為函式模板的例項化 template t add ...
c 之模板函式 模板
模板就是建立通用的模具,大大提高復用性。c 的另一種程式設計思想是泛型程式設計,主要利用的就是模板。c 提供兩種模板機制 函式模板和類模板。宣告 template typename可以替換成class 函式模板 函式模板的作用 建立乙個通用函式,其函式返回值型別和形參型別可以不具體制定,用乙個虛擬的...
C 之函式模板
c 中有很多函式僅僅是引數型別不同,但是實現過程相似,可以寫乙個通用的函式,使用非例項化的引數型別,該引數在函式被呼叫時進行例項化,這種函式稱之為模板函式 普通函式 引數值未定,但引數型別已知 模板函式 引數值和引數型別均為未知 template t表示未確定的模板引數型別 void functio...