अपनी नवीनतम वार्ता में से एक में, हर्ब सटर ने 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 सबसे अच्छा तरीका क्या है?