template<class T> //告訴編譯器 下面如果出現(xiàn)T不要報錯趴荸,T是一個通用類型,template<class T>等價于template<typename T>
自動類型推導(dǎo)顿涣,必須有參數(shù)類型才可以推導(dǎo)
例:
template <class T>
void mySwap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
void test()
{
int a = 10;
int b = 20;
//自動推導(dǎo)
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ù) 可以進行隱式類型轉(zhuǎn)換
函數(shù)模板不可以進行隱式類型轉(zhuǎn)換
函數(shù)模板和普通函數(shù)在一起調(diào)用規(guī)則:
- 如果出現(xiàn)重載涛碑,優(yōu)先使用普通函數(shù)調(diào)用孵淘,如果普通函數(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ù)模板進行兩次編譯垮衷,在聲明的地方對模板代碼本身進行編譯乖坠,在調(diào)用的地方對參數(shù)替換后的代碼進行編譯
模板的局限性
模板不能解決所有的類型。
如果出現(xiàn)不能解決的類型熊泵,可以通過第三代具體化自定義數(shù)據(jù)類型,解決上述問題
如果具體化能夠優(yōu)先匹配徐许,那么就選擇具體化
語法
template<> 返回值 函數(shù)名<具體類型>(參數(shù)...){}