0:
模板是一些為多種類型而編寫的函數(shù)和類,而且這些類型都沒有指定。當(dāng)使用模板的時(shí)候,只需要把所希望的類型作為一個(gè)(顯示或隱示的)實(shí)參傳遞給模板。模板是語(yǔ)言本身所具有的特效,她完全支持類型檢查和作用域。
并不是把模板編譯成一個(gè)可以處理任何類型的單一實(shí)體;而是對(duì)于實(shí)例化模板參數(shù)的每種類型,(編譯器)都從模板產(chǎn)生出一個(gè)不同是實(shí)體。
這種用具體類型代替模板參數(shù)的過程叫實(shí)例化(instantiation)。她產(chǎn)生一個(gè)模板的實(shí)例。
1:
如何試圖基于一個(gè)不支持模板內(nèi)部所使用的操作的類型實(shí)例化一個(gè)模板,將會(huì)導(dǎo)致一個(gè)編譯期錯(cuò)誤。
so,模板被編譯了兩次:a,實(shí)例化之前,先檢查模板代碼本身語(yǔ)法是否正確;b,在實(shí)例化期間,檢查是否所模板的有調(diào)用都有效。
這不同于普通函數(shù)中編譯與鏈接之間的區(qū)別,對(duì)于普通函數(shù)只要有聲明(不需要定義)就可以通過編譯。然而當(dāng)使用函數(shù)模板并引發(fā)模板實(shí)例化的時(shí)候,編譯器需要查看模板的定義。
2:實(shí)參演繹deduction
template
inline T const& max (T const& a, T const& b)//a.b是調(diào)用參數(shù)
{
return a < b ? b : a;
}
如果傳遞兩個(gè)int給參數(shù)類型T const&,那么編譯器能夠得出結(jié)論:T必須是int。這里不允許進(jìn)行自動(dòng)類型轉(zhuǎn)換。
max(4, 5.6);
error MSB6006: “CL.exe”
error C2782: “const T &max(const T &,const T &)”: 模板 參數(shù)“T”不明確
解決error:
對(duì)實(shí)參強(qiáng)制類型轉(zhuǎn)換max(4, static_cast
顯示指定T類型指定兩個(gè)不同類型參數(shù)。
inline T1 const& max (T1 const& a, T2 const& b)
對(duì)于指定兩個(gè)不同類型參數(shù),由于該模板函數(shù)有返回類型,另個(gè)參數(shù)的實(shí)參可能要轉(zhuǎn)型為返回類型而不會(huì)在意調(diào)用者意圖;而且把另一個(gè)參數(shù)轉(zhuǎn)型為返回類型的過程將會(huì)創(chuàng)建一個(gè)局部臨時(shí)對(duì)象,所以返回類型必須是T1不能是T1 const& 。
因?yàn)檎{(diào)用參數(shù)(a,b)的類型構(gòu)造自模板參數(shù)T,所有模板參數(shù)和調(diào)用參數(shù)通常是相關(guān)的。這個(gè)概念就叫實(shí)參演繹。
如max
當(dāng)模板參數(shù)和調(diào)用參數(shù)沒有發(fā)生關(guān)聯(lián)或不能由調(diào)用參數(shù)確定模板參數(shù)時(shí),在調(diào)用時(shí)就必須顯示指定模板實(shí)參。
template
inline RT max (T1 const& a, T2 const&
b);
模板實(shí)參演繹并不適合返回類型,因?yàn)镽T不會(huì)出現(xiàn)在調(diào)用參數(shù)的類型里面,因此調(diào)用并不能演繹出RT。所以需要顯示指導(dǎo)模板實(shí)參列表。
max
如果改變模板參數(shù)的聲明順序就只需指定返回類型
template < typename RT , typename T1, typename T2,>
max
因?yàn)楸仨氾@示指定”最后一個(gè)不能被隱式演繹的模板之前的”所有實(shí)參類型,返回類型不能被演繹而調(diào)用參數(shù)可讓演繹過程推導(dǎo)出。
3:重載函數(shù)模板
int const& max(int onst& a, int const& b)
{return a
template
inline T const& max(T const& a, T const& b)
{return a
template
inline T const& max(T const& a, T const& b, T const& c)
{ max(max(a, b), c); }
max(7,4,5);//調(diào)用三參數(shù)的模板
max(4.2, 3.0);//調(diào)用max
max(‘a(chǎn)’, ‘b’);//調(diào)用max
max(3, 5);//調(diào)用int重載的非模板函數(shù)
max(3, 5.1);//調(diào)用int重載的非模板函數(shù)
max<>(3, 5);// 調(diào)用max
max