2012-05-29 63 views
6

如何擦除輸出迭代類型std::insert_iteratorstd::back_insert_iterator?是否可以使用boost any_iterator這樣做?型擦除C++輸出迭代

#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:你應該查看「C++類型的擦除」,但是對於一個簡短的定義「把具有通用接口的各種類型變成具有相同接口的一種類型的過程」。 Boost ::任何將是典型的例子。 –

+0

@JesseGood Aaa我知道這是什麼,我從來不知道它被稱爲「類型擦除」。衛生署! –

回答

6

any_iterator沒有設計用於輸出迭代,這是back_insert_iterator是什麼(或者,對於這個問題,輸入迭代器)。

back_insert_iterator被定義爲從iterator<output_iterator_tag, void, void, void, void>即繼承其value_typereference_typedistance_typepointer_type都是void,但any_iterator預計能夠間接通過其背襯迭代非空值。也許它會更好地命名爲any_value_iterator;但是這是一個detail類模板。

+0

謝謝。在Boost中有沒有其他選擇? –

+0

不是我所知道的;問題是'boost :: iterator_facade'希望能夠在類中定義operator []和operator->。 用'boost :: function'來包裝'operator ='(這是實際重要的輸出迭代器的唯一部分)來定義自己不應該太困難。 – ecatmur

3

所以我使用Boost實現了我自己的一個。

#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 std :: iterator_traits :: value_type'來代替'typename OutIt :: container_type :: value_type',這樣你就可以使用你的模板。生指針。 – ecatmur