溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++11中如何使用using

發(fā)布時間:2021-09-24 11:27:33 來源:億速云 閱讀:143 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了C++11中如何使用using,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1. 定義別名

在 C++ 中可以通過 typedef 重定義一個類型,語法格式如下:

typedef 舊的類型名 新的類型名;
// 使用舉例
typedef unsigned int uint_t;

被重定義的類型并不是一個新的類型,僅僅只是原有的類型取了一個新的名字。和以前的聲明語句一樣,這里的聲明符也可以包含類型修飾,從而也能由基本數(shù)據(jù)類型構(gòu)造出復(fù)合類型來。C++11 中規(guī)定了一種新的方法,使用別名聲明 (alias declaration) 來定義類型的別名,即使用 using。

在使用的時候,關(guān)鍵字 using 作為別名聲明的開始,其后緊跟別名和等號,其作用是把等號左側(cè)的名字規(guī)定成等號右側(cè)類型的別名。類型別名和類型的名字等價,只要是類型的名字能出現(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 其實是一個別名,其本質(zhì)是一個函數(shù)指針,指向的函數(shù)返回類型是 int,函數(shù)參數(shù)有兩個分別是 int,double 類型。

使用 using 定義函數(shù)指針別名的寫法看起來就非常直觀了,把別名的名字強制分離到了左邊,而把別名對應(yīng)的實際類型放在了右邊,比較清晰,可讀性比較好。

2. 模板的別名

使用 typedef 重定義類似很方便,但是它有一點限制,比如無法重定義一個模板,比如我們需要一個固定以 int 類型為 key 的 map,它可以和很多類型的 value 值進行映射,如果使用 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;
}

通過上邊的例子可以直觀的感覺到,需求簡單但是實現(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)的類型,這樣使編寫的程序變得更加靈活,看起來也更加簡潔一些。

最后在強調(diào)一點:using 語法和 typedef 一樣,并不會創(chuàng)建出新的類型,它們只是給某些類型定義了新的別名。using 相較于 typedef 的優(yōu)勢在于定義函數(shù)指針別名時看起來更加直觀,并且可以給模板定義別名。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C++11中如何使用using”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)
推薦閱讀:
  1. c++中using
  2. using如何使用

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI