模板分類(lèi)
模板分為函數(shù)模板與類(lèi)模板兩類(lèi)刃宵。
函數(shù)模板
- 模板聲明
template <模板形參表> 函數(shù)返回類(lèi)型 函數(shù)(形參表);
- 模板定義
template <模板形參表>
函數(shù)返回類(lèi)型 函數(shù)(形參表){
函數(shù)體;
};
例如
template <typename T> T Max(T a,T b){
return a>b?a:b;
}
函數(shù)模板實(shí)參類(lèi)型不一致問(wèn)題
template <typename T>
inline const T& Max(const T& a, const T& b){
return a>b?a:b;
}
Max(2,2.4)
參數(shù)推導(dǎo)會(huì)出現(xiàn)模板實(shí)參類(lèi)型int與double不一致的錯(cuò)誤。
解決方法:
1.每個(gè)模板參數(shù)獨(dú)立類(lèi)型
template <typename T , typename U> inline const T& Max(const T& a, const U& b){
return a>b?a:b;
}
注意:這種解決方法還有一個(gè)問(wèn)題韧献,就是返回值只能強(qiáng)制設(shè)置為T(mén)或者U末患,不能自動(dòng)推導(dǎo)。
C++11的后置推導(dǎo)可以解決這個(gè)問(wèn)題锤窑。
template <typename T, typename U>
inline auto Max(const T& a, const U& b)->decltype(a>b?a:b)
{
return a>b?a:b;
}
2.顯示指定模板實(shí)參類(lèi)型
Max<int>(2,2.4)
或者
Max<double>(2,2.4)
3.實(shí)參強(qiáng)制類(lèi)型轉(zhuǎn)換
Max(2,static_cast<int>(2.4))
或者
Max(static_cast<double>(2),2.4)
概念
- 模板實(shí)例化(instantiation):具體類(lèi)型代替模板參數(shù)的過(guò)程璧针。
- 模板特化(specialization):模板實(shí)例化后的實(shí)體(類(lèi)、函數(shù))渊啰。
- 模板參數(shù)推導(dǎo)/推演(deduction):由模板實(shí)參類(lèi)型確定模板形參的過(guò)程探橱。
類(lèi)模板參數(shù)允許自動(dòng)類(lèi)型轉(zhuǎn)換(隱式轉(zhuǎn)換);函數(shù)模板參數(shù)不允許自動(dòng)類(lèi)型轉(zhuǎn)換(隱式轉(zhuǎn)換)
類(lèi)模板
- 模板聲明
template <模板形參表> class 類(lèi)名;
- 模板定義
template <模板形參表>
class 類(lèi)名 {
}
- 模板實(shí)例化
類(lèi)名<模板實(shí)參表> 對(duì)象;
- 模板參數(shù)表
多個(gè)模板參數(shù)之間,分割申屹。模板參數(shù),模板參數(shù),... - 模板參數(shù)
- 類(lèi)型形參
class 類(lèi)型形參或者typename 類(lèi)型形參 - 非類(lèi)型模版參數(shù)
非類(lèi)型模板的實(shí)參只能是整型常量、枚舉值或者指向外部鏈接對(duì)象的指針隧膏。
不能使用浮點(diǎn)型哗讥、類(lèi)對(duì)象、內(nèi)部鏈接對(duì)象的指針胞枕。
類(lèi)模板
類(lèi)模板:不完整的類(lèi)杆煞,一個(gè)或者多個(gè)成員類(lèi)型未確定。
函數(shù)模板:不完整的函數(shù)曲稼,一個(gè)或者多個(gè)參數(shù)類(lèi)型未確定索绪。
成員函數(shù):只有調(diào)用時(shí)才會(huì)被實(shí)例化。
靜態(tài)成員:每次類(lèi)模板實(shí)例化贫悄,都會(huì)被實(shí)例化瑞驱。
類(lèi)實(shí)例化成對(duì)象,類(lèi)模板實(shí)例化成類(lèi)窄坦。
- 特化:具體指定類(lèi)模板的全部模板參數(shù)的類(lèi)型唤反。
- 局部特化:具體指定類(lèi)模板的部分模板參數(shù)的類(lèi)型。
類(lèi)模板特化鸭津,每個(gè)成員函數(shù)必須重新定義彤侍。
類(lèi)模板特化,相當(dāng)于函數(shù)模板的重載
實(shí)例:三元組模版Triple