模板顯示實參
在某些情況下,編譯器無法推斷出模板的實參類型。其他一些情況下,我們希望用戶控制模板實例化。當函數類型與參數列表中任何類型不同的時候,這兩種情況最常出現。
指定顯示的模板實參
在某些情況下,編譯器無法推斷出模板實參的類型。在其他一些情況下,我們希望允許用戶控制模板實例化。當函數返回類型和參數列表的任何類型都不同的時候,這兩種情況最常出現。
指定顯示的模板實參
作爲一個允許用戶指定使用類型的例子,我們將定義一個名爲sum的函數模板,它以接收兩種不同類型的參數。我們允許用戶指定結果的類型。這樣,用戶就可以選擇合適的精度了。
template <typename T1,typename T2,typename T3>
T1 sum(T2,T3);
在這個例子中,沒有任何函數實參類型來判斷T1的類型。每次調用sum時候調用者必須爲T1提供一個顯示模板實參。
我們提供顯示模板實參的方式與定義類模板實例的方式不同。顯示模板實參在尖括號中給出,位於函數名之後,參數列表之前。
auto val3 = sum<long,long>(i,lng);
此調用顯示指定T1的類型。而T2和T3的類型由編譯器從i和long的類型來判斷。
顯示模板實參由左到右的順序與對應的模板參數匹配;第一個模板實參與第一個模板參數匹配,第二個實參與第二個參數匹配,依次類推。只有尾部參數的顯示模板實參纔可以或略,而且前提是他們可以從函數參數推斷出來。如果我們的sum函數按照如下的形式來編寫:
template <typename T1,typename T2,typename T3> T1 sum(T2 a,T3 b)
{
return a+b;
}
int main()
{
auto data = sum<long,long>(1,2);
auto data2 = sum<long>(1,2);
return 0;
}
這兩種寫法都是可以的編譯器可以自行推斷出返回結果
string D1("a");
string D2("n");
auto data2 = sum<string>(D1,D2);
這些例子告訴我們當我們顯示的提供一些模板實參的時候,編譯器是具有一定的推斷能力的。