2012-05-29 15 views
6

std::insert_iterator और std::back_insert_iterator के रूप में उत्पादन iterators से प्रकार को मिटाने के लिए कैसे? ऐसा करने के लिए any_iterator को बढ़ावा देना संभव है?प्रकार मिट सी ++ उत्पादन iterator

#include <boost/range.hpp> 
#include <boost/range/detail/any_iterator.hpp> 
#include <vector> 

typedef boost::range_detail::any_iterator< 
    int, boost::incrementable_traversal_tag, int &, std::ptrdiff_t > It; 

int main() 
{ 
    std::vector<int> v; 
    It outIt(v.begin()); // compiles 
    It inserter(std::back_inserter(v)); // does not compile 
    return 0; 
} 
+0

"मिटा प्रकार" से आपका क्या मतलब है? –

+0

@EitanT: आप "सी ++ प्रकार विलोपन" देखना चाहिए, लेकिन एक छोटी परिभाषा "है कि एक ही इंटरफेस के साथ एक प्रकार में एक आम इंटरफेस के साथ प्रकार की एक विस्तृत विविधता मोड़ करने की प्रक्रिया के लिए"। बूस्ट :: कोई भी कैनोलिक उदाहरण होगा। –

+0

@JesseGood एएए मुझे लगता है कि क्या है पता है, मैं कभी नहीं पता था कि यह "प्रकार विलोपन" कहा जाता है। रवींद्र! –

उत्तर

6

any_iteratorउत्पादन iterators, जो क्या back_insert_iterator है (या कहें कि, इनपुट iterators के लिए,) है साथ प्रयोग के लिए नहीं बनाया गया है।

back_insert_iteratoriterator<output_iterator_tag, void, void, void, void> अर्थात से इनहेरिट करना परिभाषित किया गया है इसकी value_type, reference_type, distance_type और pointer_type सभी void हैं, लेकिन any_iterator एक गैर शून्य मान के लिए अपने समर्थन iterator के माध्यम से अप्रत्यक्ष करने में सक्षम हो उम्मीद है। शायद यह बेहतर होगा any_value_iterator; लेकिन फिर यह detail वर्ग टेम्पलेट है।

+0

धन्यवाद। बूस्ट में कोई विकल्प हैं? –

+0

ऐसा नहीं है कि मुझे पता है; समस्या यह है कि 'boost :: iterator_facade'' ऑपरेटर [] 'और' ऑपरेटर-> 'कक्षा में परिभाषित करने में सक्षम होने की अपेक्षा करता है। 'ऑपरेटर =' को लपेटने के लिए 'boost :: function' का उपयोग करके स्वयं को परिभाषित करना बहुत कठिन नहीं होना चाहिए (जो वास्तव में महत्वपूर्ण आउटपुट इटरेटर का एकमात्र हिस्सा है)। – ecatmur

3

तो मैं अपने ही एक बूस्ट का उपयोग कर कार्यान्वित किया।

#include <boost/function_output_iterator.hpp> 
#include <boost/function.hpp> 

template < class T > 
class AnyInserter : public boost::function_output_iterator< boost::function< void (const T & value) > > 
{ 
private: 
    typedef typename boost::function_output_iterator< boost::function< void (const T & value) > > BaseType; 
    template < class OutIt > struct Insert 
    { 
     Insert(OutIt it) : m_it(it) {} 
     void operator() (const T & value) { m_it++ = value; } 
     OutIt m_it; 
    }; 
public: 
    template < class OutIt > 
     explicit AnyInserter(const OutIt & it) : BaseType(Insert<OutIt>(it)) {} 
}; 

template < class OutIt > 
    inline AnyInserter< typename OutIt::container_type::value_type > 
    makeAnyInserter(const OutIt & it) 
    { 
     return AnyInserter< typename OutIt::container_type::value_type >(it); 
    } 
+2

यह ठीक दिखता है। एक बिंदु यह है कि 'typename outIt :: container_type :: value_type' के बजाय आप 'typename std :: iterator_traits :: value_type' का उपयोग करना चाहेंगे ताकि आप अपने टेम्पलेट का उपयोग उदा। कच्चे पॉइंटर्स – ecatmur

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