2016-01-08 10 views
10

Elegance, kapsülleme ve ADL'den faydalanmak için (Argument Dependent Lookup) işlev argümanının ad alanı içinde bir işlev tanımlamak yaygındır.İkili bir operatör için en iyi ad alanı nedir?

Farklı ad alanında iki kitaplığım olduğunu varsayalım. Üç vaka vardır: 1) biri kontrol ettiğim bir kütüphanenin bir kısmı ve diğeri üçüncü taraf (örneğin Boost) veya 2) İkisini de kontrol ediyorum, ya da 3) Hiçbirini kontrol etmiyorum (sadece “yapıştırıcı” kodu yazıyor).

Böyle bir şey var,

ben A'ya 'de "stream" B istiyorum
namespace ns_A{ 
    struct A{...}; // something that looks like iostream 
} 
namespace ns_B{ 
    struct B{...}; 
} 

, en iyi seçenek

namespace ???{ // what is more correct ns_A, or ns_B? 
    A& operator<<(A& a, B const& b){...} 
} 

nedir ya ben hem ad koymak gerekir?

namespace ns_B{ 
    A& operator<<(A& a, B const& b){...} 
} 
namespace ns_A{ 
    using ns_B::operator<<; 
} 

böyle bir ikili işlevini tanımlamak için en iyi ad hangisidir?

(C++ 11'in ad satır içi herhangi bir öneri değiştiriyor mu?)

(diğer şeyler eşit olduğunda o sezgisel namespace ns_B tercih daha iyi görünüyor çünkü örnek operator<< kullanın.)

+2

Denetlemediğiniz ad alanıyla uğraşmayın. – Walter

cevap

4

Operatörünüzü isim alanına koyabilirsiniz ve işe yarayacaktır. En iyi uygulama olarak, kodunuza ait ad alanına koyun.

5

1 durumunda, kolaydır: kontrol ettiğiniz namespace içine koyun.

Durum 2, seçiminize göre: daha mantıklı görünen her şey. Örnek durumunuzda, ns_B'u tercih ederim.

Yalnızca zor olan durum 3'tür. namespace'a gerçekten eklememelisiniz. Kendi üçüncü namespace mine'un bir parçası olarak yeni 'tutkal' işlevselliğini istiyorsanız, doğal olarak oraya koyun ve bu işlevin mine içinde kullanımı otomatik olarak çözülecektir. Doğal olarak, bu ADL'yi desteklemeyecektir, fakat buna gerek yoktur, çünkü istediğiniz tek şey mine içindeki yeni işlevselliği başka bir yerde kullanmamaktır.

1

Benim önerim: İsim alanlarından hiçbirini kullanmayın. ns_A'daki kod, kendi başına ns_A içinde herhangi bir şeyin varlığından haberdar değildir - buna bağlı değildir; ns_B ve ns_A yapılarıyla ilgili kod ns_A'a ait değildir. Aynı şey simetri ile ns_B için de geçerlidir.

Sizin operator<< muhtemelen hiçbir ad alanıdır (ama ns_A ise ns1::ns2 ve ns_B sonra ns1 kullanmak ns1::ns3 olan) ns_A ve ns_B arasında "en küçük ortak ad", olmalıdır.

Açıkça benimsenmediği bir ad alanına kodu zorlamak, benim düşünceme göre, zarif değil ve enkapsülasyonu kırıyor, kavramsal olarak. ADL'ye gelince, ns_A ve ns_B'un "en az bilinen ad alanı" ndan daha fazlasını beklememeniz gerektiğini düşünüyorum.

+0

Kesinlikle tavsiye ederim. Bu düşünmek için bir seçenektir. En iyi kısım, ADL ile ilgili iyi şeyler çalışmaya devam edecektir. – alfC