C 11 using定義型別別名 模板別名

2021-10-03 06:39:42 字數 2847 閱讀 3650

在c++98/03裡,我們可以通過typedef 關鍵字定義乙個型別的別名,比如 typedef unsigned int uint_t;在這裡我們定義了unsigned int型別的別名和uint_t,在以後需要使用unsigned int的時候我們都可以用uint_t替換,但是uint_t僅僅是作為unsigned int的乙個別名,如下的定義是不合法的:

typedef

unsigned

int uint_t;

void

func

(unsigned

int)

;void

func

(uint_t)

;// error 不合法的過載

上面的func函式是乙個不合法的函式過載,雖然使用typedef定義乙個型別的別名很方便,但是typedef在使用上存在一些限制,比如說typedef無法重定義乙個模板的別名。

考慮下面例子,我們在實際程式設計中經常使用到stl中的map,我們map的string型別的資料作為map的key,我們想根據string型別的key對映為乙個string,int,long等型別的資料.

typedef std::mapint> map_t;

//...

typedef std::map < std::string, std::string > map_str;

//...

如果需要對映成10中型別的資料,我們就需要利用typedef定義10個具體型別的別名,但是考慮到map的key值始終是變的,我們是否像下面一樣可以用typedef+模板來定義乙個別名呢

template

<

typename t>

typedef std::map map;

map<

int> map_i;

map map_str;

遺憾的是上述的定義不能通過編譯,也就是c++ 98/03並不支援這樣的操作,而通常是通過乙個包裹類的方式來實現上述的需求:

template

<

typename t>

struct alias_map // 包裹類;

alias_map<

int>

::map map_t;

alias_map<

int>

::map map_str;

通過包裹類的方法雖然可以實現上述的需求,但是一看**就覺得,這個**可讀性差,不就是定義乙個變數嗎?還需要整乙個包裹類來封裝下,增加**裡不說,看著都煩,小幸運的是c++11終於讓你可以不用通過上述這種臃腫的方式來實現這個需求了。c++11中,新增了乙個特性就是可以通過使用using來為乙個模板定義別名,比如說上述的需求,使用c++11就可以這樣實現:

template

<

typename t>

using alias_map = std::map < std::string, t >;

alias_map<

int> map_t;

alias_map map_str;

系不繫看著舒服很多啊,頓時神清氣爽,在c++11中,允許使用using關鍵字為乙個模板來定義別名,實際上using包含了typedef的所有功能,來看下使用using關鍵字和typedef關鍵字定義普通型別別名的用法。

typedef

unsigned

int uint_t;

using uint_t =

unsigned

int;

// using替代typedef

typedef std::mapint> map_t;

using map_t = std::map < std::string,

int>

;// using替代typedef

可以看到在對普通型別的別名定義上,兩種方法的使用基本等效,唯一不同的僅僅是定義的語法,using使用起來就像是賦值,但是在定義函式函式指標的時候,using看起來可讀性要稍微好一點,比如:

typedef

void

(*func)

(int

,int);

using func =

void(*

)(int,

int)

;

可能突然看起來使用using的方式來定義乙個函式指標有點怪,但是習慣了之後會發現使用using這種賦值的方式更適用開發人員的思考方式。下面再顯示乙個通過typedef和using方式分別來定義乙個函式模板的例子:

template

<

typename t>

struct funcst // 包裹類;

funcst<

int>

::func func_typedef;

template

<

typename t>

using func_using =

void

(*func)

(t, t)

;func_using<

int> func_using;

可以看到通過using定義模板別名的語法,僅僅是在普通型別別名語法基礎上增加了template引數列表,通過using可以輕鬆的建立乙個模板的別名,而不需要像c++98/03那樣增加乙個包裹類。但是需要額外注意的是使用using或者typedef僅僅是定義乙個別名,不會創造新型別。

定義型別別名 typedef,using

說到型別別名,無非是給型別名 如int,char,float,double,bool 取乙個比較有特殊含義的名字而已 最常用的關鍵莫過於typedef吧 typedef最常見的用法是與結構體struct連用,這是c語言的語法,c 已經不這樣用了 或者很少這樣用 在c語言中宣告結構體常用以下格式 1 ...

C 學習筆記 型別別名

一 c 為型別建立別名的方式有兩種 1 使用預處理器 define byte char 預處理器將在編譯程式時用char替換所有的byte,從而使byte成為char的別名。2 使用c 關鍵字typedef來建立別名 typedef typename aliasname include typede...

c 11模板別名using

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