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

2021-10-23 09:43:12 字數 1793 閱讀 7411

#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標準中,巢狀模板的右尖括號中間必須加空格(不加會與右移》操作符產生二義性);

2、在c++11標準中則對此進行了優化,無需在巢狀模板的右尖括號中間加空格。

template

<

typename n>

struct foo

;int

main

(void

)

如上示例:

1、在c++98/03標準中對於foo<100 >> 2> 會正常編譯;

2、在c++11標準中則報錯,解決方法:foo<(100 >> 2)>.

1、在c++98/03標準中可以使用typedef;

2、在c++11標準中新增了using方式。

typedef

unsigned

int uint_t;

//<=>

using uint_t =

unsigned

int;

void

func

(unsigned

int)

;void

func

(uint_t)

;// error c2084: 函式「void func(unsigned int)」已有主體

typedef mapint> map_int_t;

typedef map map_str_t;

如上示例中,map的key都是string型別,要求將其第二個引數模板化:

//在c++98/03標準中可使用外敷模板方式實現

template

<

typename t>

struct map_str

;//在c++11標準中則直接使用using實現

template

<

typename t>

using map_str = map

;

如上示例,可見using定義模板比外敷模板更簡易易讀。

1、typedef 無法重定義乙個模板;

2、c++11引入using來重定義乙個模板;

3、using包含了typedef的所有別名定義;

4、using 語法和 typedef 一樣,並不會創造新的型別。

在 c++98/03 中,類模板可以有預設的模板引數,但函式模板不行;

在 c++11中,函式模板支援預設模板引數,當自動推導生效時,預設模板引數會被直接忽略。

#include

template

<

typename t =

double

,typename u>

t func

(u u)

intmain()

C 11 新特性 模板別名

豆子 2012年5月22日 c 參考文章 2002 年,iso c 標準化組織就已經提出了模板別名的概念。不過那時候還是叫做 typedef template。在接下來的幾年中,以 gabriel dos reis 和 bjarne stroustrup 為代表的開發者發展了這個想法,最終,我們在 ...

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

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

c 11模板別名using

對於冗長或複雜的識別符號,如果能夠建立其別名將很方便。以前c 為此提供了typedef typedef std vector iterator ittype c 11提供了另一種建立別名的語法 using using ittype std vector iterator ittype 差別在於新語法...