2016-01-08 8 views
10

लालित्य, encapsulation और एडीएल (Argument Dependent Lookup) का शोषण करने के लिए फ़ंक्शन तर्क के नामस्थान के अंदर एक फ़ंक्शन को परिभाषित करना आम है।बाइनरी ऑपरेटर के लिए सबसे अच्छा नेमस्पेस क्या है?

मान लीजिए कि मेरे पास अलग-अलग नामस्थान में दो पुस्तकालय हैं। तीन मामले हैं 1) एक पुस्तकालय मैं नियंत्रित करता हूं और दूसरा तीसरा पक्ष (उदाहरण के लिए बूस्ट) है, या 2) मैं दोनों को नियंत्रित करता हूं, या 3) मैं किसी को नियंत्रित नहीं करता (केवल "गोंद" कोड लिख रहा हूं)।

मैं कुछ इस तरह है,

namespace ns_A{ 
    struct A{...}; // something that looks like iostream 
} 
namespace ns_B{ 
    struct B{...}; 
} 

मैं एक करने के लिए करने के लिए "धारा" बी चाहते हैं, क्या सबसे अच्छा विकल्प

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

है या मैं इसे दोनों नामस्थान में रखना चाहिए?

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

कौन इस तरह एक द्विआधारी समारोह को परिभाषित करने के लिए सबसे अच्छा नाम स्थान है?

(सी ++ 11 के नाम स्थान इनलाइन किसी भी सिफारिश को बदलने करता है?)

(मैं उदाहरण operator<< उपयोग करें, क्योंकि, अन्य बातों के समान होने के बावजूद यह लगता सहज namespace ns_B पसंद करते हैं करने के लिए बेहतर हो।)

+2

नामस्थान के साथ बेवकूफ मत बनो जिसे आप नियंत्रित नहीं करते हैं। – Walter

उत्तर

4

आप अपने ऑपरेटर को किसी भी नामस्थान में डाल सकते हैं और यह काम करेगा। एक सर्वोत्तम अभ्यास के रूप में, इसे अपने नाम से संबंधित नामस्थान में रखें।

5

मामले में 1, यह आसान है: इसे namespace पर रखें जिसे आप नियंत्रित करते हैं।

2 मामले में, यह आपकी पसंद पर निर्भर करता है: जो भी अधिक तार्किक दिखाई देता है। आपके उदाहरण मामले में, मैं ns_B पसंद करूंगा।

एकमात्र मुश्किल स्थिति 3 है। आपको वास्तव में namespace में जोड़ना नहीं चाहिए। यदि आप अपने स्वयं के तीसरे namespace mine के हिस्से के रूप में नई 'गोंद' कार्यक्षमता चाहते हैं, तो स्वाभाविक रूप से इसे वहां रखें और mine के भीतर उस कार्यक्षमता का कोई भी उपयोग स्वचालित रूप से हल हो जाएगा। स्वाभाविक रूप से, यह एडीएल को नहीं बढ़ाएगा, लेकिन इसके लिए कोई आवश्यकता नहीं है, क्योंकि आप चाहते हैं कि mine के भीतर नई कार्यक्षमता का उपयोग करें, कहीं और नहीं।

1

मेरा सुझाव: किसी भी नामस्थान का उपयोग न करें। ns_A में कोड ns_A में किसी भी चीज़ के अस्तित्व के बारे में पता नहीं है - यह इस पर निर्भर नहीं है; इसलिए ns_B और ns_A संरचनाओं के संबंध में कोड ns_A में नहीं है। समरूपता द्वारा ns_B के लिए भी यही सच है।

आपका operator<<ns_A और ns_B के बीच "कम से कम सामान्य नाम स्थान" है, जो शायद कोई नाम स्थान है (लेकिन यदि ns_A है ns1::ns2 और ns_Bns1::ns3 तो ns1 का उपयोग होता है) में होना चाहिए।

किसी नामस्थान में कोड को मजबूर करना स्पष्ट रूप से संबंधित नहीं है, मेरी राय में, सुरुचिपूर्ण नहीं है और अवधारणा को अवधारणात्मक रूप से तोड़ता है। एडीएल के लिए, मुझे लगता है कि आपको ns_A और ns_B के "कम से कम आम नामस्थान" से अधिक की अपेक्षा नहीं करनी चाहिए।

+0

निश्चित रूप से बोल्ड सिफारिश। यह विचार करने का एक विकल्प है। सबसे अच्छा हिस्सा, एडीएल के बारे में अच्छी चीजें काम करते रहेंगे। – alfC

संबंधित मुद्दे