c 11 模板的細節改進

2021-09-08 22:20:45 字數 1960 閱讀 2423

c++11改進了編譯器的解析規則,盡可能的將多個右尖括號(>)解析為模板引數結束符,方便編寫模板相關的**。

1. 模板的右尖括號

2. 模板的別名

之前的c++使用 typedef 來為型別指定別名,在c++11中,可以使用using 來指定別名。

typedef std::map< std::string, int> map_int_t;

//using map_int_t = std::map;

typedef std::map< std::string, std::string> map_str_t;

//using map_str_t = std::map< std::string, std::string>;

如果需要指定map的key為std::string, 而value任意,則對於之前的c++,不得不這麼做:

templatestruct str_map;

//....

str_map::type impl;

//在c++11中,使用using進行簡化

templateusing str_map_t = std::map< std::string, t>; //指定型別別名

....

str_map_tmap_int_t; //用型別別名定義變數

使用typedef

typedef void(*func_t)(int, int);

使用using

using func_t = void(*)(int, int);

待模板引數的函式指標

使用typedef

templatestruct func_t;

func_t::type xx_1;

使用 using

templateusing func_t = void(*)(t, t);

func_t xx_2; //宣告變數

3. 函式模板的預設引數

在c++98/03中,類模板可以有預設引數,如下:

templatestruct foo;

但是不支援函式的預設模板引數

template< typename t = int> //在c++98/03中不被支援

void func(void);

在c++11中,可以支援函式模板的預設引數

template< typename t = int> //在c++98/03中不被支援

void func(void);

int main()

當所有模板引數都有預設引數時,函式模板的 呼叫如同乙個普通函式。對於類模板而言,即使所有引數都有預設引數,在使用時也必須在模板名後面跟隨<>來例項化。

template//預設模板引數沒有必須寫在參數列最後的位置

r func(u val)

int main(void)

在呼叫函式模板時,若顯示指定模板的引數,引數填充順序從右往左!!

func(123); //引數從右向左填充,則u被視為long型別,則返回的123為long型別

函式模板引數型別自動推導

templatevoid f(t val)

tempaltestruct identity;

templatevoid func(typename identity::type val, t = 0);

int main()

C 11 模板的改進

在c 98 03的泛型程式設計中,模板例項化有乙個很繁瑣的地方,就是連續兩個右尖括號 會被編譯解釋成右移操作符,而不是模板參數列的形式,需要乙個空格進行分割,以避免發生編譯時的錯誤。template class x template class y int main 在例項化模板時會出現連續兩個右尖...

用C 11語法改進模版細節

早期的c 版本在模板中不支援連續的兩個尖括號。mingw中編譯報錯,vs中好像沒發現這問題。如下 template t struct foo templatet class a foo type x error 編譯出錯 被當成操作符處理了,右移操作,二義性 foo type x ok 注意空格 c...

C 11新特性之模板改進 別名

include using namespace std template typename t class foo foo private t foo template typename u classa a private u a intmain 如上示例 1 在c 98 03標準中,巢狀模板的右...