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標準中,巢狀模板的右...