C++11中使用using的方法
在 C++ 中 using 用于聲明命名空間,使用命名空間也可以防止命名沖突。在程序中聲明了命名空間之后,就可以直接使用命名空間中的定義的類了。在 C++11 中賦予了 using 新的功能,讓 C++ 變得更年輕,更靈活。
1. 定義別名
在 C++ 中可以通過 typedef 重定義一個類型,語法格式如下:
typedef 舊的類型名 新的類型名; // 使用舉例 typedef unsigned int uint_t;
被重定義的類型并不是一個新的類型,僅僅只是原有的類型取了一個新的名字。和以前的聲明語句一樣,這里的聲明符也可以包含類型修飾,從而也能由基本數(shù)據(jù)類型構(gòu)造出復(fù)合類型來。C++11 中規(guī)定了一種新的方法,使用別名聲明 (alias declaration) 來定義類型的別名,即使用 using。
在使用的時(shí)候,關(guān)鍵字 using 作為別名聲明的開始,其后緊跟別名和等號,其作用是把等號左側(cè)的名字規(guī)定成等號右側(cè)類型的別名。類型別名和類型的名字等價(jià),只要是類型的名字能出現(xiàn)的地方,就能使用類型別名。使用typedef定義的別名和使用using定義的別名在語義上是等效的。
使用 using 定義別名的語法格式是這樣的:
using 新的類型 = 舊的類型; // 使用舉例 using uint_t = int;
通過 using 和 typedef 的語法格式可以看到二者的使用沒有太大的區(qū)別,假設(shè)我們定義一個函數(shù)指針,using 的優(yōu)勢就能凸顯出來了,看一下下面的例子:
// 使用typedef定義函數(shù)指針 typedef int(*func_ptr)(int, double); // 使用using定義函數(shù)指針 using func_ptr1 = int(*)(int, double);
如果不是特別熟悉函數(shù)指針與 typedef,第一眼很難看出 func_ptr 其實(shí)是一個別名,其本質(zhì)是一個函數(shù)指針,指向的函數(shù)返回類型是 int,函數(shù)參數(shù)有兩個分別是 int,double 類型。
使用 using 定義函數(shù)指針別名的寫法看起來就非常直觀了,把別名的名字強(qiáng)制分離到了左邊,而把別名對應(yīng)的實(shí)際類型放在了右邊,比較清晰,可讀性比較好。
2. 模板的別名
使用 typedef 重定義類似很方便,但是它有一點(diǎn)限制,比如無法重定義一個模板,比如我們需要一個固定以 int 類型為 key 的 map,它可以和很多類型的 value 值進(jìn)行映射,如果使用 typedef 這樣直接定義就非常麻煩:
typedef map<int, string> m1; typedef map<int, int> m2; typedef map<int, double> m3;
在這種情況下我們就不自覺的想到了模板:
template <typename T> typedef map<int, T> type; // error, 語法錯誤
使用 typename 不支持給模板定義別名,這個簡單的需求僅通過 typedef 很難辦到,需要添加一個外敷類:
#include <iostream> #include <functional> #include <map> using namespace std; template <typename T> // 定義外敷類 struct MyMap { typedef map<int, T> type; }; int main(void) { MyMap<string>::type m; m.insert(make_pair(1, "luffy")); m.insert(make_pair(2, "ace")); MyMap<int>::type m1; m1.insert(1, 100); m1.insert(2, 200); return 0; }
通過上邊的例子可以直觀的感覺到,需求簡單但是實(shí)現(xiàn)起來并不容易。在 C++11 中,新增了一個特性就是可以通過使用 using 來為一個模板定義別名,對于上面的需求可以寫成這樣:
template <typename T> using mymap = map<int, T>;
完整的示例代碼如下:
#include <iostream> #include <functional> #include <map> using namespace std; template <typename T> using mymap = map<int, T>; int main(void) { // map的value指定為string類型 mymap<string> m; m.insert(make_pair(1, "luffy")); m.insert(make_pair(2, "ace")); // map的value指定為int類型 mymap<int> m1; m1.insert(1, 100); m1.insert(2, 200); return 0; }
上面的例子中通過使用 using 給模板指定別名,就可以基于別名非常方便的給 value 指定相應(yīng)的類型,這樣使編寫的程序變得更加靈活,看起來也更加簡潔一些。
最后在強(qiáng)調(diào)一點(diǎn):using 語法和 typedef 一樣,并不會創(chuàng)建出新的類型,它們只是給某些類型定義了新的別名。using 相較于 typedef 的優(yōu)勢在于定義函數(shù)指針別名時(shí)看起來更加直觀,并且可以給模板定義別名。
到此這篇關(guān)于C++11中使用using的方法的文章就介紹到這了,更多相關(guān)C++11 using使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11右值引用和std::move語句實(shí)例解析(推薦)
右值引用(及其支持的Move語意和完美轉(zhuǎn)發(fā))是C++0x將要加入的最重大語言特性之一。這篇文章主要介紹了C++11右值引用和std::move語句實(shí)例解析,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03VC實(shí)現(xiàn)A進(jìn)程窗口嵌入到B進(jìn)程窗口中顯示的方法
這篇文章主要介紹了VC實(shí)現(xiàn)A進(jìn)程窗口嵌入到B進(jìn)程窗口中顯示的方法,對于理解windows程序運(yùn)行原理的進(jìn)程問題有一定的幫助,需要的朋友可以參考下2014-07-07C++中g(shù)etline()、gets()等函數(shù)的用法詳解
這篇文章主要介紹了C++中g(shù)etline()、gets()等函數(shù)的用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟
本文主要介紹了CMake 生成靜態(tài)庫與動態(tài)庫的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06