2014-09-30 38 views
9

在C++中匿名命名空間等同於:如果我在標題中需要匿名命名空間,該怎麼辦?

namespace $$$$ { 
    //something 
} 
using namespace $$$$; 

哪裏$$$$是某種獨特的標識符。匿名命名空間對於不應在編譯單元之外看到的代碼非常有用。

到目前爲止很好,但是最近我開始用模板編寫一些代碼,這樣的代碼必須在頭文件中,所以使用匿名命名空間沒有多大意義,因爲只包含頭文件將會使隔離效果無效。

然後問題是,在這種情況下建議的方式是什麼?我開始使用一個名爲Private的命名空間。它並不能阻止任何想要使用內部標識符的人,但至少可以將名稱衝突減少爲ID「Private」。

有沒有更好的方法?建議?

+5

AFAIK這就是你能做的,模板庫中經常使用的命名空間,如'detail'用於這個目的。 – user657267 2014-09-30 10:12:05

+0

理想情況下,您的所有代碼應該位於某種名稱空間中。將你的模板放入名爲Utility的某種名稱空間,或者Alpha或MyWork等等。並將幫助功能也放在那裏。 – 2014-09-30 10:18:58

+0

感謝user657267;那是我正在尋找的確認。我擔心我錯過了明顯的。 – 2014-09-30 12:19:44

回答

3

堅持與您的Privatenamespace(或使用更受歡迎detail)。記住C++訪問機制背後的主要思想是難以濫用它們,這不是不可能的。保護自己免受意外事故,而不是惡意攻擊。

4

如果你對這種孤立感到絕望,爲什麼不是好的舊文件static?據undeprecated:

template <typename T> 
static void foo() 
{} 

int main() 
{ 
    foo<char>(); 
} 

話又說回來,如果你只需要foo內的一個翻譯單元,那麼想必你只包括它在翻譯單元內的頭,然後它沒有任何事情無論是「在標題中」。所以,不要將模板包含在其他翻譯單元中,而且您已經基本實現了隔離目標。

真的保證隔離所有可能的實例(即包括那些你該TU中創建),使用static如上,或者乾脆利用一個detail命名空間記錄你的意圖。

+0

+1:如果要在多個TU中使用它們,模板只需放在標題中。 – 2014-09-30 10:26:45

0

在標頭中隱藏模板代碼實現的最常見方法是將實現放入名爲detail的名稱空間中。

例如:

namespace cpputil { // my c++ utility library namespace 

    namespace detail { // implementation details of this libraries headers go here 

    // a functor private to the library 
    template<class T> 
    struct private_functor { 
     private_functor(const T& t) : _t(t) {} 
     void write(std::ostream& os) const { _t.write(os); } 
    private: 
     const T& _t; 
    }; 

    // an extension to std::ostream::operator<< 
    template<class T> 
    std::ostream& operator<<(std::ostream& os, const private_functor<T>& pf) 
    { 
     pf.write(os); 
     return os; 
    } 
    } 

    /// a public template function that is designed to allow an object to be emitted to a stream 
    /// returns a function object that calls T::write(std::ostream&) when placed into an 
    /// output stream 
    template<class T> 
    detail::private_functor emit(const T& t) { 
    return detail::private_functor<T>(t); 
    } 
} 

// can be used like this: 

int main() { 
    struct S { 
    void write(std::ostream& os) const { os << "{I am an S}"; } 
    }; 

    std::cout << cpputil::emit(S) << std::endl; 
    return 0; 
} 
相關問題