2011-09-28 9 views
8

अपनी नवीनतम वार्ता में से एक में, हर्ब सटर ने end(container)container.begin() पर फ़ंक्शंस टेम्पलेट को मुक्त करने की अनुशंसा की। मुझे यह पसंद है, क्योंकि ये फ़ंक्शन सभी पुनरावृत्त प्रकारों के लिए प्रदान किए जा सकते हैं जो प्रारंभ()/end() विधियों के साथ नहीं आते हैं। चूंकि मेरे अधिकांश डोमेन वर्गों में इंटरफेस हैं जो डोमेन भाषा में बात करते हैं और सामान्य नामों जैसे स्टार्ट/एंड का उपयोग नहीं करते हैं, अब मैं मुख्य वर्ग इंटरफ़ेस को गड़बड़ किए बिना एसटीएल कंटेनर और लूप के लिए रेंज बेस के लिए एक इष्टतम इंटरफ़ेस प्रदान कर सकता हूं। मुझे आश्चर्य है कि मेरे अपने प्रकार के लिए प्रारंभ/समाप्ति कार्य प्रदान करने का सबसे अच्छा तरीका क्या है। मेरा पहला विचार यह था कि मैं swap के साथ ऐसा ही करता हूं और उसी नामस्थान में फ़ंक्शन लिखता हूं जहां मेरा प्रकार रहता है।अपने खुद के प्रकारों के लिए मुफ्त प्रारंभ/समाप्ति कार्य कैसे प्रदान करें

namespace My 
{ 

class Book 
{ 
public: 
    typedef std::vector<Page>::const_iterator PageIterator; 

    PageIterator FirstPage() const { return begin(pages_); } 
    PageIterator LastPage() const { return end(pages_); } 

private: 
    std::vector<Page> pages_; 
}; 

Book::PageIterator begin(const Book& b) 
{ 
    return b.FirstPage(); 
} 

Book::PageIterator end(const Book& b) 
{ 
    return b.LastPage(); 
} 

} 

क्या एडीएल में भरोसा करना ठीक है, या क्या वे एसडीडी नेमस्पेस में होना चाहिए? मुझे लगता है कि एक और तरीका है std नेमस्पेस में विशेषज्ञता प्रदान करना (std में ओवरलोडिंग की अनुमति नहीं है, है ना?)। Loops के आधार पर रेंज के लिए लुकअप के बारे में espcially सबसे अच्छा तरीका क्या है?

उत्तर

8

मैं एडीएल को अपना काम करने दूंगा। जबकि आपको std नेमस्पेस में विशेषज्ञता जोड़ने की अनुमति है, तो ऐसा करने का कोई मजबूत कारण नहीं है जब मैं आपके नामस्थान में एक सादा मुक्त फ़ंक्शन पर्याप्त हो।

छोरों के लिए सीमा के लिए

विशेष रूप से, मानक कहता है:

§6.5.4/1 (की परिभाषा शुरू-expr और अंत expr):

  • अन्यथा, प्रारंभ-expr और end-expr begin(__range) और end(__range) क्रमशः हैं, जहां प्रारंभ और अंत तर्क-निर्भर लुकअप (3.4.2) के साथ देखा जाता है। इस नाम के प्रयोजनों के प्रयोजनों के लिए, नामस्थान std एक संबंधित नेमस्पेस है।
4

यह बिल्कुल ठीक है और एडीएल पर "भरोसा" करने की अनुशंसा की जाती है। begin और end फ़ंक्शंस आपके प्रकार के इंटरफ़ेस का हिस्सा हैं (भले ही वे फ़्रीस्टैंडिंग फ़ंक्शंस हैं या नहीं) और वे आपके नाम के समान नामस्थान में होना चाहिए।

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