豆子
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型別的精度,範圍都足夠,在其他的系統中可能就不能滿足需求,可能需要擴大字長,或者需要提高精度等等。方法有多種,其中之一就是定義別...