C 11 新特性 模板別名

2021-07-11 11:29:25 字數 1881 閱讀 2190

豆子 

2023年5月22日

c++ 

參考文章:

2002 年,iso c++ 標準化組織就已經提出了模板別名的概念。不過那時候還是叫做 typedef template。在接下來的幾年中,以 gabriel dos reis 和 bjarne stroustrup 為代表的開發者發展了這個想法,最終,我們在 c++ 11 中見到了這個新特性—— template aliases。

不過,只有在最新版本的 gcc 實現中才能使用這個特性(4.7 或更新版本)。但這並不是說這個特性很難實現——其實它是很容易實現的,對容器和記憶體管理函式這樣的庫尤其有用。可能只是開發者忘記在之前的版本中新增上這個功能 ;-p。

這個特性的核心功能很簡單:提供型別族的別名。注意,這裡並沒有引入新的關鍵字,而是使用舊的using關鍵字,加上新的語法組成。例如:

c++

1

2

3

4

5

6

7

#include

template

<

class

t>

struct

alloc

; template

<

class

t>

using

vec=

std::

vector

alloc

<

t>>

;

vec<

int>v;

// 等價於 std::vector> v;

我們為所有可能的 t 型別的std::vector>宣告了乙個名字 vec。這樣,這個模板的別名就可以用作其它型別,只要直接加上 t 的實際型別就可以了。

我們可以寫出更複雜的示例,但是語法還是一樣的。把複雜的**變得簡單總是看起來很有趣的(對此而言,舊版本的 c++ 也有一些簡化的寫法)。如果對此感興趣,那麼就看看下面的**吧:

c++

1

2

3

4

5

6

7

8

9

10

template

<

typename

t>

class

allocator

; };

allocator

<

t>

::rebind

<

u>

::otherx;

我們用 c++ 11 的模板別名重寫一下:

c++

12

3

4

5

6

7

8

9

10

template

<

typename

t>

class

allocator

; allocator

<

t>

::rebind

<

u>x;

事實上,在 c++ 11 的記憶體分配庫、智慧型指標庫以及其它各種庫中,有很多類似 rebind 這樣的模板別名。我們可以從 gcc 最新版本的**中看到這些別名的用例。

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模板別名using

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

C 11新特性(5) 型別別名

為什麼需要別名 下面的說明只是乙個例子,實際的使用場景一定不止這些。假設有乙個二維圖形計算的程式,定義了乙個point結構體。struct point 在有些系統中,int型別的精度,範圍都足夠,在其他的系統中可能就不能滿足需求,可能需要擴大字長,或者需要提高精度等等。方法有多種,其中之一就是定義別...