簡體   English   中英

類型擦除的C ++輸出迭代器

[英]type-erased C++ output iterator

如何從輸出迭代器中刪除類型為std::insert_iteratorstd::back_insert_iterator 是否可以使用boost any_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;
}

any_iterator不是設計用於輸出迭代器 ,這是back_insert_iterator (或者,就此而言, 輸入迭代器 )。

back_insert_iterator被定義為從iterator<output_iterator_tag, void, void, void, void>繼承iterator<output_iterator_tag, void, void, void, void>即它的value_typereference_typedistance_typepointer_type都是void ,但any_iterator期望能夠通過其支持迭代器間接到非void值。 也許它會更好地命名為any_value_iterator ; 但后來它是一個detail類模板。

所以我用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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM