使用 using


using 用來導入名稱,最常見的是導入名稱空間,例如,想使用 std 名稱空間中的名稱,又不想加上 std:: 前置的話,之前文件中許多範例都是如下撰寫:

using namespace std;

如果名稱空間形成巢狀,也可以指定內部的名稱空間,例如:

using namespace util::xyz;

using 不一定要撰寫在全域,也可以在函式或方法中撰寫,例如,僅在 foo 中導入 std 中的名稱:

void foo() {
    using namespace std;
    cout << "XD" << endl;
}

using 也可用來導入某個名稱,例如僅導入 std::stringstd:cout

#include <iostream>
#include <string>
using std::string;

int main() {
    string str = "Example";
    using std::cout;
    cout << str;
}

在〈shared_ptr〉中也看過,指明接下來的範疇中,使用的 swap 都會是 std::swap,而不是 SharedPtrswap 方法:

...
void swap(SharedPtr& sharedPtr) {
    using std::swap;
    swap(this->p, sharedPtr.p);
    swap(this->pctr, sharedPtr.pctr);
    swap(this->del, sharedPtr.del);
} 

using 也可以用於類別繼承時定義的導入,例如〈繼承共同行為〉中看過,可以使用 using 將繼承的成員導入至指定的權限區塊,當時舉的例子是,若父類 P 中有 publicpublicMemberprotectedprotectedMember

class D : private P {
public:
    using P::publicMember;    // 維持 public

protected:
    using P::protectedMember; // 維持 protected
};

實際上,也可以將父類中 protected 權限,以 using 導入子類中的 public 區塊:

class D : private P {
public:
    using P::publicMember;    // 維持 public
    using P::protectedMember; // 成為 public
};

繼承共同行為〉中也看過,想直接繼承父類定義的建構流程,可以透過 using 指定父類名稱來達到:

class SwordsMan : public Role {
public:
    using Role::Role;

    void fight() {
        cout << "揮劍攻擊" << endl;
    }
};

在〈遮蔽父類方法〉中看過,using 也可用來定義名稱,例如,定義 super 為父類,之後使用 super 來代表父類:

class SwordsMan : public Role {
    using super = Role;

public:
    using Role::Role;

    void fight() {
        cout << "揮劍攻擊" << endl;
    }

    string to_string() {
        return "SwordsMan" + super::to_string();
    };
};

其他更多有關 using 的細節,可以參考〈Using-declaration〉。