参照ではなく、実際の値の型のみを逆参照できるイテレータを作成しようとしています。を使用してこれは可能boost::iterator_facadeですか、それとも address\reference によって返される値が必要ですか?
より具体的に言うと、イテレータは参照の a を返しますstd::pair。つまり、イテレータvalue_typeはどこにも保存されず、逆参照時にオンザフライで作成されます ( のようにstd::map::iterator)。
参照ではなく、実際の値の型のみを逆参照できるイテレータを作成しようとしています。を使用してこれは可能boost::iterator_facadeですか、それとも address\reference によって返される値が必要ですか?
より具体的に言うと、イテレータは参照の a を返しますstd::pair。つまり、イテレータvalue_typeはどこにも保存されず、逆参照時にオンザフライで作成されます ( のようにstd::map::iterator)。
はい、ご希望のことが可能です。以下をご覧ください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(...); }
...
};