2012-05-29 9 views
6

タイプを出力イテレータから消去するにはstd::insert_iteratorstd::back_insert_iterator?これを行うにはブースト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++型消去」を探すべきですが、「共通インタフェースを持つ多種多様な型を同じインタフェースを持つ1つの型に変換するプロセス」という短い定義です。 Boost :: Anyは標準的な例です。 –

+0

@JesseGood Aaa私はそれが何であるかを知っています。私はそれが「タイプ消去」と呼ばれることを知らなかった。ドー! –

答えて

6

any_iteratorback_insert_iteratorが何であるかである出力イテレータ、(そのことについて、または、入力イテレータ)で使用するために設計されていません。

back_insert_iteratoriterator<output_iterator_tag, void, void, void, void>から継承するように定義される、すなわち、そのvalue_typereference_typedistance_typepointer_typeは全てvoidであるが、非ボイド値へのバッキング・イテレータを介して間接的にできるようにany_iterator期待します。おそらくany_value_iteratorという名前の方がいいでしょう。それはdetailクラステンプレートです。

+0

ありがとうございます。ブーストには何か別の選択肢がありますか? –

+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

いいですね。 1つの点は、 'typename OutIt :: container_type :: value_type'の代わりに、' typename std :: iterator_traits :: value_type'を使用して、テンプレートを使用できるようにすることです。生ポインタ。 – ecatmur

関連する問題