2012-04-27 20 views
9

मैं एक इटरेटर बनाने की कोशिश कर रहा हूं जो केवल वास्तविक मूल्य प्रकारों को अस्वीकार कर सकता है, न कि संदर्भों के लिए। क्या यह boost::iterator_facade का उपयोग कर संभव है, या क्या मुझे ऐसे मान रखने की आवश्यकता है जिन्हें एड्रेस \ संदर्भ द्वारा वापस किया जा सके।बूस्ट इटरेटर मुखौटा और dereference() फ़ंक्शन

अधिक specfic होने के लिए, मेरी इटरेटर संदर्भ उपस्थित std::pair देता है, जिसका मतलब है कि मेरी iterators value_type अपसंदर्भन पर कहीं भी संग्रहीत नहीं है, लेकिन मक्खी पर बनाया (जैसे std::map::iterator)।

उत्तर

14

हां, जो चीज आप चाहते हैं वह संभव है। कृपया, boost/iterator_facade.hpp पर एक नज़र डालें (उदाहरण के संस्करण 1.49.0 के बूस्ट lib के लिए है लेकिन यह भी अपने नए वितरण के लिए ठीक है):

template < 
    class Derived 
    , class Value 
    , class CategoryOrTraversal 
    , class Reference = Value& 
    , class Difference = std::ptrdiff_t 
> 
class iterator_facade 

खाका तर्क Reference कुंजी है। boost::iterator_facade से प्राप्त होने पर आपको केवल Reference निर्दिष्ट करना चाहिए। उदाहरण के लिए, आपका कोड निम्न जैसा दिख सकता है:

template<typename value_type> 
class custom_iterator 
    : public boost::iterator_facade< 
      custom_iterator<value_type>, 
      value_type, 
      boost::forward_traversal_tag, 
      value_type 
     > 
{ 
    ... 
    value_type dereference() const{ return value_type(...); } 
    ... 
}; 
+0

इस उत्तर के लिए धन्यवाद, वास्तव में मेरी मदद की। हालांकि, मेरे पास कोई प्रश्न है, संदर्भ टेम्पलेट तर्क निर्दिष्ट करने से पहले, मैंने अभी मान को वापस करने का प्रयास किया है। यह संकलित लेकिन मुझे बहुत अजीब परिणाम दिए, जैसे कि मेरी कक्षा में पॉइंटर्स अजीब समय पर शून्य हो जाते हैं। मुझे लगता है कि मेरा सवाल है, यह बिल्कुल संकलित क्यों हुआ? – FlamFace

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