9

参照ではなく、実際の値の型のみを逆参照できるイテレータを作成しようとしています。を使用してこれは可能boost::iterator_facadeですか、それとも address\reference によって返される値が必要ですか?

より具体的に言うと、イテレータは参照の a を返しますstd::pair。つまり、イテレータvalue_typeはどこにも保存されず、逆参照時にオンザフライで作成されます ( のようにstd::map::iterator)。

4

1 に答える 1

14

はい、ご希望のことが可能です。以下をご覧くださいboost/iterator_facade.hpp(例はバージョン 1.49.0 の Boost ライブラリですが、新しいディストリビューションでも問題ありません):

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

テンプレート引数Referenceが鍵です。Referenceから派生するときに指定するだけboost::iterator_facadeです。たとえば、コードは次のようになります。

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(...); }
    ...
};
于 2012-12-26T12:05:59.593 に答える