2014-09-30 16 views
9

anonim ad eşdeğerdir ++. Anonim ad alanı, derleme biriminin dışında görülmemesi gereken kod için kullanışlıdır.

Şimdiye kadar çok iyi, ancak son zamanlarda şablonlarla bazı kodlar yazmaya başladım, bu kodun başlıklarda olması gerekir, bu nedenle anonim ad alanlarının kullanılması, başlığın yalnızca dahil edilmesi yalıtım etkisini geçersiz kılacağından çok anlam ifade etmemektedir. O zaman sorun şu ki, bu durumlarda önerilen yol nedir? Private adlı bir adlandırılmış ad alanı kullanmaya başladım. İçerdeki tanımlayıcıları kullanmak isteyen herhangi bir kimseyi gerçekten durdurmaz, ancak en azından "Özel" kimliğindeki ad çakışmasını azaltır.

Daha iyi yollar var mı? Öneriler?

+5

AFAIK, şablon kütüphaneleri genellikle bu tür bu çok amaç için detail' 'olarak ad kullanmak. – user657267

+0

İdeal olarak tüm kodlarınız bir çeşit ad alanında olmalıdır. Şablonlarınızı Utility, Alpha veya MyWork ya da bir şey olarak adlandırılan bir tür ad alanına koyun. Ve yardım fonksiyonlarını da oraya koy. –

+0

Teşekkürler kullanıcı657267; aradığım onay buydu. Korkarım ki bariz eksikti. –

cevap

3

Privatenamespace ile sopa (veya daha popüler olan detail kullanın). C++ erişim mekanizmalarının ardındaki ana fikri, onları kötüye kullanmak zorlaştırmak imkansız değil. Kendinizi kötü niyetli saldırılara değil, kazalara karşı koruyun.

4

Bu izolasyon için çaresiz iseniz, neden eski iyi dosya-static? Bu undeprecated edildi:

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

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

Sonra tekrar, sadece o zaman muhtemelen sadece bu çeviri birimi içinde bir başlıkta bunu dahil ediyoruz, foo içinde bir çeviri birimi gerekir ve o zaman mesele olursa olsun o olsun yapmazsa "bir başlıkta". Bu yüzden, şablonları diğer çeviri birimlerine dahil etmeyin ve zaten büyük ölçüde yalıtılmış hedefinize ulaştınız.

için tüm olası örneklemi (yani bu TU içinde oluşturduk olanlar dahil) teminat izolasyon gerçekteniçin yukarıdaki olarak static kullanmak ya da sadece bir detail ad kullanarak niyet belgelemek.

+0

+1: Şablonlar, bunları birden çok TU’da kullanmak istiyorsanız yalnızca bir başlık içinde olmak zorundadır. –

0

Bir üstbilgide şablon kodunun uygulanmasını gizlemenin en genel yolu, uygulamayı detail adlı bir ad alanına koymaktır. Örneğin

: Yapabileceğiniz tek şey

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; 
} 
İlgili konular