2011-05-24 14 views
13

boost::swap पर प्रश्नों का जोड़ा। कृपया नीचे दिए गए कोड का संदर्भ लें जो मूल रूप से boost/swap.hpp से कट-पेस्ट है। मैं लाइब्रेरी संस्करण 1.43.0 का जिक्र कर रहा हूं।बढ़ावा पर प्रश्न :: स्वैप

namespace boost_swap_impl 
    { 
     template<class T> 
     void swap_impl(T& left, T& right) 
     { 
     using namespace std;//use std::swap if argument dependent lookup fails 
     swap(left,right); 
     } 

    template<class T, std::size_t N> 
    void swap_impl(T (& left)[N], T (& right)[N]) 
    { 
    for (std::size_t i = 0; i < N; ++i) 
    { 
     ::boost_swap_impl::swap_impl(left[i], right[i]); 
    } 
    } 
} 

namespace boost 
{ 
    template<class T1, class T2> 
    void swap(T1& left, T2& right) 
    { 
    ::boost_swap_impl::swap_impl(left, right); 
    } 
} 
  1. boost::swaptemplate <typename T1, typename T2> के रूप में क्यों घोषित किया जाता है जब कोड यह सब एक ही प्रकार के साथ काम कर रहा है के बाकी हिस्सों में?
  2. यदि मैं अपना खुद का वैश्विक फ़ंक्शन void swap(T&, T&) परिभाषित करता हूं तो मुझे लगता है कि यह वैश्विक कार्य है जिसे swap_impl(T& left, T& right) से बुलाया जाता है। क्या यह कोई संघर्ष नहीं है और इसलिए swap_impl के बाद से एक त्रुटि स्थिति namespace std का भी उपयोग करती है जिसने स्वैप परिभाषित किया है?

उत्तर

19
  1. इस से std::swap ताकि आप अधिभार अस्पष्टता त्रुटियों नहीं मिलता है जब दोनों std::swap और boost::swap दायरे में हैं (std::swap को प्राथमिकता दी जाएगी) यह कम विशेष बनाता है।
  2. नहीं, गैर टेम्पलेट्स हमेशा टेम्पलेट्स पर पूर्वता अधिभार संकल्प के दौरान है, तो एक नाम स्थान-दायरे वाले गैर टेम्पलेट swap दोनों boost::swap और std::swap पर वरीयता दी जाएगी (के रूप में एक नाम स्थान-दायरे वाले टेम्पलेट swap एक UDT – के लिए अतिभारित आंशिक रूप से सोचेंगे विशेषीकृत, लेकिन वास्तव में नहीं ..)। ध्यान दें कि std::swap के विपरीत, boost::swap स्पष्ट रूप से ADL का लाभ लेने के लिए लिखा गया है।

यहाँ सी ++ 03 मानक क्या दोनों अंक – [over.match.best] (§13.3.3/1) के बारे में क्या कहना है है:

परिभाषित आईसीएस मैं (F) के रूप में इस प्रकार है:

  • , अगर F एक स्थिर सदस्य समारोह है आईसीएस (F) कि आईसीएस 1 +०१२३०३२१८३४३ इस तरह परिभाषित किया गया है(F) न तो कोई समारोह G के लिए बेहतर है और न ही आईसीएस (G) से भी बदतर है, और, संतुलित, आईसीएस (G) न बेहतर है और न ही आईसीएस से (F) भी बदतर है; अन्यथा,
  • देना आईसीएस मैं (F) अंतर्निहित रूपांतरण अनुक्रम कि व्यवहार्य समारोह F की मैं वें पैरामीटर के प्रकार के लिए सूची में मैं वें तर्क धर्मान्तरित को दर्शाते हैं। 13.3.3.1 निहित रूपांतरण अनुक्रमों को परिभाषित करता है और 13.3.3.2 परिभाषित करता है कि इसका मतलब एक अंतर्निहित रूपांतरण अनुक्रम के लिए बेहतर रूपांतरण अनुक्रम या किसी दूसरे से बदतर रूपांतरण अनुक्रम होना है।

इन परिभाषाओं को देखते हुए, एक व्यवहार्य समारोह F1 अगर सभी तर्कों मैं, आईसीएस मैं (F1) के लिए से भी बदतर एक रूपांतरण अनुक्रम नहीं है एक व्यवहार्य समारोह F2 की तुलना में एक बेहतर समारोह होने के लिए परिभाषित किया गया है आईसीएस मैं (F2), और फिर

    कुछ तर्क के लिए
  • जे, आईसीएस जे (F1) यदि ऐसा नहीं है कि आईसीएस जे तुलना में एक बेहतर रूपांतरण अनुक्रम (F2) है, या,
  • F1 एक गैर टेम्पलेट समारोह है और F2 एक समारोह टेम्पलेट विशेषज्ञता है कि है, या, यदि नहीं,
  • F1 और F2 समारोह टेम्पलेट विशेषज्ञताओं हैं, और F1 के लिए समारोह टेम्पलेट 14.5.5.2 में वर्णित आंशिक आदेश नियमों के अनुसार F2 के लिए टेम्पलेट की तुलना में अधिक विशिष्ट है, या, यदि ऐसा नहीं है कि,
  • संदर्भ एक है उपयोगकर्ता द्वारा परिभाषित रूपांतरण द्वारा प्रारंभिकरण (8.5, 13.3.1.5, और 1 देखें 3.3.1.6) और गंतव्य प्रकार के लिए F1 के रिटर्न प्रकार से मानक रूपांतरण अनुक्रम (यानी, प्रारंभिक इकाई का प्रकार) मानक प्रकार के F2 के प्रकार के मानक रूपांतरण अनुक्रम से बेहतर रूपांतरण अनुक्रम है ।
+0

@jam: +1। क्या आप मुझे सी ++ संदर्भ मानक खंड पर इंगित कर सकते हैं जो टेम्पलेट कोड पर गैर-टेम्पलेट की प्राथमिकता के बारे में बात करता है? – Fanatic23

+0

@ फैनैटिक 23: मानक उद्धरण के साथ संपादित उत्तर। – ildjarn

+0

@ildjarn: मुझे डर है कि आपका नोट [विवाद के तहत] है (http://stackoverflow.com/questions/9170247/does-c11-change-the-behavior-of-explicitly-calling-stdswap-to-ensure- ADL-loc)। मैंने सोचा कि यह मामला भी था, लेकिन शायद नहीं। – GManNickG

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