2011-01-05 10 views
6

कोएनिग लुकअप का तर्क क्या है?कोएनिग लुकअप के लिए तर्क

ऐसा कुछ ऐसा सोचने से नहीं बच सकता जो आपके कोड को पढ़ने में बहुत मुश्किल बनाता है और इंस्टेबल

क्या वे कोएनिग लुकअप को परिभाषित नहीं कर सके ताकि यह केवल विशिष्ट मामलों (यानि: गैर-सदस्य ऑपरेटरों) के लिए काम करे या स्पष्ट रूप से आवश्यक हो?

+0

इस बारे में कभी सोचा नहीं। तो मैं भी उसे जानना चाहता हूं। अच्छा प्रश्न! – Nawaz

उत्तर

5

मूल प्रेरणा, IIRC, std::operator<<(std::ostream&, int) पर स्पष्ट रूप अर्हता प्राप्त करने के बिना

std::cout << 42; 

लिखने में सक्षम हो गया था।

यदि आप तर्क निर्भर लुकअप को अक्षम करना चाहते हैं, तो आप स्पष्ट रूप से फ़ंक्शन नाम, यानी अर्हता प्राप्त कर सकते हैं। swap को swap के बजाय std::swap का उपयोग swap को रोकने के लिए जो भी नामस्थान उनके तर्कों को जीवित रखेगा।

एडीएल का उपयोग संकलन समय पर परीक्षण करने के लिए एसएफआईएनएई के साथ भी किया जा सकता है कि कुछ फ़ंक्शन किसी विशेष प्रकार के लिए परिभाषित किए गए हैं (मैं आपको व्यायाम के रूप में इसे बाहर करने देता हूं, स्टैक ओवरफ्लो पर इसके बारे में कम से कम एक प्रश्न है)।

+0

मुझे लगता है कि एडीएल पेश किए जाने के बाद एसएफआईएनएई की कल्पना की गई है। मेरा मुद्दा वैसे भी है कि मैं स्पष्ट रूप से कहने के लिए मजबूर होना चाहता हूं कि किस नाम का उपयोग करना है (या स्पष्ट रूप से एडीएल लागू करने के लिए कहें)। ... मैं उस कोड का एक टुकड़ा समझा रहा था जिसे मैंने अपने एक दोस्त को लिखा था जो सी ++ से बात नहीं करता है; नामस्थानों के बारे में बात करने में दस मिनट बिताए जाने के बाद उसने मुझसे पूछा कि क्यों, मेरे कोड के टुकड़े में, मैं इसे स्पष्ट किए बिना किसी अन्य नामस्थान से फ़ंक्शन का उपयोग कर सकता हूं।मैं बहुत ज्यादा "हाँ, अच्छी तरह से, ओह, यह अन्य नियम क्योंकि सी ++ भी मिल गया है कि ..." – peoro

+0

@peoro तरह लग रहा था: सी ++ अजीब नियमों का एक बहुत है, और यह C++ 0x के साथ बदतर होने जा रहा है। हालांकि, मुझे लगता है कि सबसे अच्छा ADL स्पष्ट रूप से 'इस->' सदस्य कार्यों बुला और स्पष्ट योग्यता का उपयोग कर जब भी यह समझ में आता है से बचा जाता है। अधिकांश समय, आपको इसकी आवश्यकता नहीं है (सदस्य फ़ंक्शन कॉल को छोड़कर)। और ऐसे समय होते हैं जब एडीएल बहुत अच्छा होता है। –

+0

@Alexandre सी .: हाँ, मैं इसे उस तरह से avoidid हो सकता है, लेकिन यह है कि उत्तर नहीं मिलता है क्यों ADL मौजूद है। मैंने सोचा था कि (यह एक मेरी निजी राय है, हाँ) यह सरल और क्लीनर हो गया होता यह है करने के लिए नहीं है, और यह _avoid_ के लिए मजबूर किया जा रहा है। किस मामले में यह महान है? फिलहाल मैं इसे सी ++ के अजीब नियम की तरह देख रहा हूं जिसे एक अच्छी वाक्यविन्यास वाली भाषा में आसानी से टाला जा सकता है। – peoro

3

एडीएल के लिए सबसे मजबूत उपयोग केस इस तरह के मामलों के लिए है।

namespace A 
{ 
    struct S {}; 
    S operator+(const S&, const S&); 
} 

namespace B 
{ 
    A::S test() 
    { 
     A::S a, b; 
     return a + b; 
    } 
} 

यह भी सामान्य कोड में सही swap समारोह का चयन इसलिए यह केवल operator कार्यों के लिए लागू नहीं करना चाहिए के लिए उपयोगी है। यह पहले से ही मानक का एक काफी जटिल हिस्सा है, जो नियमों को कुछ मामलों में काम करने से रोकता है, और जटिलता जोड़ता है, लाभ क्या होगा?

मैं स्पष्ट रूप से यह पूछने के किसी भी साफ तरीके से नहीं सोच सकता कि एक अलग नामस्थान में फ़ंक्शन को कॉल करने से काफी कम वर्बोज़ होगा और किसी भी मामले में, अभिव्यक्ति को और अधिक जटिल बना दिया जाएगा।

हम आपको कुछ ऐसा सोच रहे हैं: return [[ use_adl ]] (a + b); बनाम return A::operator+(a, b);?

+0

असल में मैं फ़ंक्शन के अंदर किसी प्रकार का कीवर्ड जोड़ने की सोच रहा था जो किनीग लुकअप का उपयोग करता है: 'शून्य एफ (कॉन्स टी एंड ए) {नेमस्पेसॉफ (टी) :: ...; } ' – peoro

+2

@peroro:' नेमस्पेसॉफ़ (टी) 'बहुत अधिक लगता है जैसे आप एक विशेष नामस्थान को देखने के लिए निर्दिष्ट कर रहे हैं; इस मामले में आपको एडीएल की जरूरत नहीं है। आप योग्य आईडी का भी उपयोग कर सकते हैं। –

+0

@ चार्ल्स बेली: हाँ लेकिन फिर मेरा प्रश्न अभी भी वहां है। एडीएल के बजाय 'नेमस्पेसॉफ़' जैसे ऑपरेटर के लिए, और नामस्थान का स्पष्ट रूप से उपयोग करने के लिए मजबूर होना क्यों आसान नहीं होगा (कंपेलरों और मानक के लिए) और क्लीनर (प्रोग्रामर के लिए और मानक के लिए)? – peoro

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