C 11 模板的改進

2021-08-07 17:04:54 字數 1333 閱讀 4843

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

template

class x{};

template

class y{};

int main()

;

在例項化模板時會出現連續兩個右尖括號,同樣static_cast、dynamic_cast、reinterpret_cast、const_cast表示式轉換時也會遇到相同的情況。c++98標準是讓程式設計師在》之間填上乙個空格,在c++11中,這種限制被取消了。在c++11標準中,要求編譯器對模板的右尖括號做單獨處理,使編譯器能夠正確判斷出」>>」是乙個右移操作符還是模板參數列的結束標記。

#include 

#include //std::is_same

using

namespace

std;

using uint = unsigned

int;

typedef

unsigned

int uint;

using sint = int;

int main()

c++11之前,類模板是支援預設的模板引數,卻不支援函式模板的預設模板引數:

//1、普通函式帶預設引數,c++98 編譯通過,c++11 編譯通過

void defparm(int m = 3) {}

//2、類模板是支援預設的模板引數,c++98 編譯通過,c++11 編譯通過

template

class defclass {};

//3、函式模板的預設模板引數, c++98 - 編譯失敗,c++11 - 編譯通過

template

void deftempparm() {}

類模板的預設模板引數必須從右往左定義,數模板的預設模板引數則沒這個限定:

template

class defclass1;

template

class defclass2; // 無法通過編譯

template

class defclass3;

template

class defclass4; // 無法通過編譯

template

void deffunc1(t1 a, t2 b);

template

void deffunc2(t a);

c 11 模板的細節改進

c 11改進了編譯器的解析規則,盡可能的將多個右尖括號 解析為模板引數結束符,方便編寫模板相關的 1.模板的右尖括號 2.模板的別名 之前的c 使用 typedef 來為型別指定別名,在c 11中,可以使用using 來指定別名。typedef std map std string,int map ...

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

詳解c 11新特性之模板的改進

c 11關於模板有一些細節的改進 模板的右尖括號 c 11之前是不允許兩個右尖括號出現的,會被認為是右移操作符,所以需要中間加個空格進行分割,避免發生編譯錯誤。int main 這個我之前都不知道,我開始學程式設計的時候就已經是c 11的時代啦。模板的別名 c 11引入了using,可以輕鬆的定義別...