c++ 模板顯示實參 的 參數類型推斷

模板顯示實參

在某些情況下,編譯器無法推斷出模板的實參類型。其他一些情況下,我們希望用戶控制模板實例化。當函數類型與參數列表中任何類型不同的時候,這兩種情況最常出現。

指定顯示的模板實參

在某些情況下,編譯器無法推斷出模板實參的類型。在其他一些情況下,我們希望允許用戶控制模板實例化。當函數返回類型和參數列表的任何類型都不同的時候,這兩種情況最常出現。

指定顯示的模板實參

作爲一個允許用戶指定使用類型的例子,我們將定義一個名爲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);

這些例子告訴我們當我們顯示的提供一些模板實參的時候,編譯器是具有一定的推斷能力的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章