簡單例子
template <typename T>
T Add(T t1, T t2)
{
return t1 + t2;
}
int main()
{
std::cout << Add(0, 1) << std::endl; //works
std::cout << Add(0.1, 1.0) << std::endl; //works
std::cout << Add("Hello", " World") << std::endl; //error
std::cout << Add(0.1, 3) << std::endl; //error
}
上述代碼中,Add(0, 1)
自動推導(dǎo)出模板T為整型珍策,而Add(0.1, 3)
報(bào)錯(cuò)铣耘,這是因?yàn)槠渫茖?dǎo)出參數(shù)是兩個(gè)類型:浮點(diǎn)數(shù)和整型,而函數(shù)聲明中只有一個(gè)類型。而Add("Hello", " World")
報(bào)錯(cuò)則是因?yàn)槠渫茖?dǎo)出其類型為const char *
坦弟,無法進(jìn)行相加操作护锤。
C++中的模板參數(shù)自動推導(dǎo)有以下原則:
- 編譯器只根據(jù)函數(shù)調(diào)用時(shí)給出的實(shí)參列表來推導(dǎo)模板參數(shù)值,與函數(shù)參數(shù)類型無光的模板參數(shù)其值無法推導(dǎo)
- 與函數(shù)返回值相關(guān)的模板參數(shù)其值也無法推導(dǎo)酿傍。原因是C++存在內(nèi)建的內(nèi)動類型轉(zhuǎn)化機(jī)制烙懦,函數(shù)返回值的類型可能發(fā)生隱式類型轉(zhuǎn)換
- 所有可推導(dǎo)模板參數(shù)必須是連續(xù)位于模板參數(shù)列表尾部,中間不能有不可推導(dǎo)的模板參數(shù)
復(fù)雜例子
template <typename T0, typename T1, typename T2, typename T3, typename T4>
T2 func(T1 v1, T3 v2, T4 v3)
{
T0 static t0 = T0(0);
T2 t2 = v1 + v2 + v3;
return t2;
};
int main()
{
std::cout << func<double, int, int>(0, 1, 1.2) << std::endl;
}
上述func
中用到多個(gè)模板參數(shù)拧粪,其中T0
和函數(shù)實(shí)參無關(guān)修陡,所以必須指定,而T2
和返回值相關(guān)可霎,所以也必須指定魄鸦,又因?yàn)槟0宓男螀⒑蛯?shí)參是通過位置來進(jìn)行關(guān)聯(lián)的,所以T1
夾在T0
和T1
之間癣朗,其也需要顯式指定拾因。T3
和T4
則可以從實(shí)參列表中推導(dǎo)出來