【讀書筆記】【深入應用C++11】1.2 模板的細節改進

摘自:深入應用C++11:代碼優化與工程應用

1.2.1 模板的右尖括號

C++98/03 會將連續的兩個右尖括號(>>)解釋爲右移操作符,而不是模板參數表的結束。
如:vector<vector<int>> vect;會出現編譯錯誤,需要改寫成vector<vector<int> > vect;
C++11中修正了這一錯誤;但是會出現與老標準不兼容的情況,如:Foo<100 >> 2> xx;需要改寫成Foo<(100 >> 2)> xx;

1.2.2 模板的別名

C++11中提供了using關鍵字,using關鍵字等價於typedef的功能,爲類型取一個別名。如:

using int32_t=int;等價於typedef int int32_t;
using func_t=void (*)(int,int);等價於typedef void (*func_t)(int,int);

C++98/03的typedef無法重定義模板,如果要定義模板必須使用外敷類。如:

template <typename Val>
struct str_map
{
        typedef map<string,Val> type;
};
str_map<int>::type map;

C++11中提供了重定義模板的語法。如:

template <typename Val>
using str_map_t=map<string,Val>;

模板別名

template <typename T>
using func_t=void (*)(T,T);

定義類型時使用了模板,這種模板稱爲模板別名。模板別名的實例化,如:

func_t<int> Func=nullptr;

1.2.3 函數模板的默認模板參數

C++98/03中,類模板可以有默認的模板參數,但函數模板卻不支持默認的模板參數。
C++11中,函數模板也支持默認的模板參數。如:

template <typename T=int>
void function()
{
    T t=12;
    cout<<t<<endl;
}

函數模板參數的推導:

當默認模板參數和模板參數自動推導結合起來使用時,書寫顯得非常靈活。
我們可以指定函數中一部分模板參數採用默認參數,而另一部分使用自動推導。
模板參數的填充順序是從右往左(從函數參數到函數返回值)。如:

template<typename R=int,typename U>
R func(U val)
{
    return val;
}
func<long>(123);

其中U的類型爲long,R的類型被推導爲long。

func(123);

其中U的類型推導爲int,R的類型被推導爲int。
模板參數自動推導總是根據實參推導來的,當自動推導生效時,默認參數會被直接忽略。

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