2014-09-30 17 views
9

Trong C++ một không gian tên vô danh tương đương với:Nếu tôi cần không gian tên ẩn danh trong tiêu đề thì sao?

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

đâu $$$$ là một số loại định danh duy nhất. Không gian tên ẩn danh sau đó hữu ích cho mã không được nhìn thấy bên ngoài đơn vị biên dịch.

Cho đến nay rất tốt, tuy nhiên gần đây tôi đã bắt đầu viết một số mã với mẫu, mã như vậy phải nằm trong tiêu đề nên việc sử dụng các không gian tên ẩn danh không có ý nghĩa gì nhiều vì việc bao gồm tiêu đề sẽ vô hiệu hóa hiệu ứng cách ly.

Sau đó, câu hỏi là, cách được đề xuất trong trường hợp này là gì? Tôi bắt đầu sử dụng một không gian tên có tên là Riêng tư. Nó không thực sự ngăn chặn bất cứ ai muốn sử dụng các định danh bên trong, nhưng ít nhất nó làm giảm các xung đột tên thành id "Riêng tư".

Có cách nào tốt hơn không? Gợi ý?

+5

AFAIK đó là tất cả các bạn có thể làm, mẫu thư viện thường sử dụng không gian tên như 'detail' cho mục đích này rất. – user657267

+0

Lý tưởng nhất là tất cả mã của bạn phải ở trong một số loại không gian tên. Đặt các mẫu của bạn vào một số không gian tên được gọi là Tiện ích, hoặc Alpha hoặc MyWork hoặc một cái gì đó. Và đặt các chức năng trợ giúp trong đó. –

+0

Cảm ơn user657267; đó là xác nhận tôi đang tìm kiếm. Tôi sợ rằng tôi đã bỏ lỡ điều hiển nhiên. –

Trả lời

3

Gắn bó với Privatenamespace (hoặc sử dụng phổ biến hơn detail). Hãy nhớ rằng ý tưởng chính đằng sau cơ chế truy cập C++ là làm cho việc lạm dụng chúng trở nên khó khăn, không phải là không thể. Bảo vệ bạn khỏi tai nạn, không tấn công nguy hiểm.

4

Nếu bạn đang tuyệt vọng cho sự cô lập đó, tại sao không phải là tệp cũ tốt- static? Nó được undeprecated:

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

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

Sau đó, một lần nữa, nếu bạn chỉ cần foo trong một đơn vị dịch thuật, sau đó có lẽ bạn chỉ bao gồm nó trong một tiêu đề trong đơn vị dịch thuật, và sau đó nó không quan trọng nào cho dù đó là "trong tiêu đề". Vì vậy, chỉ đơn giản là không bao gồm các mẫu trong các đơn vị dịch thuật khác và bạn đã phần lớn đạt được mục tiêu cô lập.

Để thực sự cách ly đảm bảo cho tất cả instantiations thể (ví dụ: bao gồm những người mà bạn đã tạo trong vòng TU này), sử dụng static như trên hoặc chỉ đơn giản là ghi lại ý định của bạn sử dụng một không gian tên detail.

+0

+1: Mẫu chỉ phải nằm trong tiêu đề nếu bạn muốn sử dụng chúng trong nhiều TU. –

0

Cách thông thường nhất để ẩn triển khai mã mẫu trong tiêu đề là đặt triển khai vào không gian tên được gọi là detail.

Ví dụ:

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; 
} 
Các vấn đề liên quan