2011-01-27 23 views
5

के लिए बॉयलरप्लेट टाइपपीफ, मानक लाइब्रेरी या बूस्ट के भीतर, किसी प्रकार की यूटिलिटी बेस क्लास है, जो आवश्यक टाइपपीफ (size_type, value_type, आदि ...) के साथ कस्टम एसटीएल-संगत अनुक्रम को पॉप्युलेट करने के लिए है। मैं boost::iterator_facade की तरह कुछ सोच रहा हूं, लेकिन कंटेनर के लिए।एसटीएल-संगत कंटेनर

मैं अपना खुद का रोल-अप करने जा रहा था, लेकिन यह सुनिश्चित करना चाहता था कि ऐसी कोई चीज़ पहले से मौजूद न हो।

अद्यतन:

यह उपयोगिता आधार वर्ग मैं के साथ आया है, इस मामले में किसी को भी यह उपयोगी पाता है:

template <class C> 
class ContainerAdapter 
{ 
public: 
    typedef C::value_type value_type; 
    typedef C::reference reference; 
    typedef C::const_reference const_reference; 
    typedef C::const_iterator iterator; 
    typedef C::const_iterator const_iterator; 
    typedef C::difference_type difference_type; 
    typedef C::size_type size_type; 

protected: 
    typedef C::container_type; 
}; 


// Usage 
class MyCustomContainer : public ContainerAdapter< std::vector<int> > 
{ 
... 
}; 

ContainerAdapter बस "गूँज" नेस्टेड एक कस्टम कंटेनर की अंतर्निहित कंटेनर के typedefs। वास्तव में इसके लिए कुछ भी नहीं है।

+0

लोग value_type और iterator का उपयोग करते हैं क्योंकि यह विकल्पों की तुलना में आसान है, लेकिन मैं आमतौर पर value_type और संदर्भ के बजाय उपयोग करता हूं, उदाहरण के लिए (और वेक्टर बुरा है)। क्या आप निश्चित रूप से उन अन्य नेस्टेड टाइपिफ्स प्रदान करना आपके लिए फायदेमंद हैं? आम तौर पर मैं उन कार्यों को आइटम पास करता हूं जहां उन्हें एक कॉन्स के रूप में बाध्य किया जाएगा और वैसे भी, नेस्टेड const_reference typedef को कभी स्पर्श नहीं किया जाता है। –

+0

@Fred: मैं बस अपने कंटेनर को BOOST_FOREACH, बूस्ट रेंज, std :: back_insertion_iterator, आदि जैसी चीज़ों के अनुकूल होने के बारे में चिंतित हूं। अगर मुझे केवल सभी टाइपिफ़ीज़ का न्यूनतम सबसेट प्रदान करने की आवश्यकता है, तो मैं जानना चाहता हूं कौन कौन से। मुझे लगता है कि प्रयोग करना और पता लगाना काफी आसान है। –

+0

सच है, लेकिन सामान्य उपयोगिताओं को आम तौर पर अज्ञेयवादी माना जाता है; 0x ऑटो उसके लिए बहुत अच्छा है। :) –

उत्तर

1

यदि यह अस्तित्व में है, तो भी आपको typedef typename base::size_type size_type होना चाहिए। ऐसा प्रतीत नहीं होता है कि आपको अधिक लाभ होगा।

+0

यदि आप कक्षा घोषणा के भीतर टाइपिफ को दिखाना चाहते हैं तो आपको व्युत्पन्न कक्षा में केवल पुनः टाइप करने की आवश्यकता है। कस्टम कंटेनर के उपयोगकर्ता अभी भी बेस क्लास से विरासत में प्राप्त सभी टाइपिफ़ी देखेंगे। इस प्रकार 'boost :: iterator_facade' काम करता है। –

+0

@ एमिली मुझे पता है, लेकिन कंटेनरों के लिए मानते हुए आपको ऑपरेटरों और अन्य चीजों को प्रदान करना होगा जो उन प्रकारों का उपयोग करेंगे। – Anycorn

+0

@aaa: मैं हमेशा 'टी',' टी & ', 'कॉन्स्ट टी एंड' इत्यादि का उपयोग कर सकता हूं। केवल एक ही टाइपिफ़ी जिन्हें मुझे वास्तव में चाहिए (घोषणा के भीतर) 'इटरेटर' और 'कॉन्स्ट_इटरेटर' हैं। हालांकि, मैं स्वीकार करता हूं कि सदस्य फ़ंक्शन घोषणाओं में 'संदर्भ', 'value_type', आदि होने पर दस्तावेज़ प्रलेखन बिंदु से सुंदर है। –