2016-06-18 46 views
0

儘管我搜索了,但我不知道這是否可能。防止第三方使用我的整個命名空間

如何防止圖書館用戶在他/她的代碼中的任何地方編寫using namespace myns;

比方說,我實現了一個包裹它在一個名爲myns命名空間的所有元素庫:

namespace myns 
{ 
    class MyClass 
    { 

    }; 

    class string 
    { 

    }; 
} 

該庫將被其他程序員使用。我怎麼能強迫他/她使用的

// somewhere in code 
myns::MyClass myClass; 
myns::string myString; 
std::string stdString; 

代替

using namespace myns; 

// somewhere in code 
MyClass myClass; 
string myString; // this would most likely be a mess 
string stdString; 

這與命名空間衝突的幫助。

+0

第三方程序員將被迫在不確定性的情況下,明確指定命名空間呢。即你的最後一個樣本將不會被編譯,除非程序員分別預置'std ::'和'myns ::',不管使用'namespace'聲明。 – TerraPass

+0

爲了舉例,我寫了'string'。關鍵是我想阻止他使用「命名空間」。 –

回答

3

你不能。該標準說,你可以寫using namespace myns;來獲得所有的名字,並且你沒有辦法做到這一點。

如果用戶在using namespace XXX;之後得到衝突,那是他自己的錯。一般來說,如果他們試圖阻止人們在腳下自我射擊是不可能的。最後,從某些第三方名稱空間中提取所有名稱並不是偶然發生的事情,但自從時間的黎明以來一直不鼓勵。如果用戶決定這麼做,他會更好地知道他在做什麼。真的不是圖書館維護者的問題。

+0

好吧,是的,這就是要點。執行一條規則可以防止懶惰的程序員浪費時間來查找哪些符號位於哪個命名空間中。 –

+1

@AlexandruIrimiea正如我所說,你不能那樣做。 –

1

我能想到的一個(可問題的)解決方法是用同名的類或結構替換名稱空間,並將名稱空間中的所有內容都轉換爲此類的(靜態)成員。

struct myns final 
{ 
    class MyClass 
    { 

    } 

    class string 
    { 

    } 

private: 
    // private constructor, copy constructor and assignment operator 
    // ... 
}; 

這將排除程序員,使用圖書館從寫using namespace myns但是......嗯,就像我說的,我認爲這樣的解決方法是相當可疑的。

注意,用戶仍然可以使用類型別名,如:

using string = myns::string; 
相關問題