参照ではなく、実際の値の型のみを逆参照できるイテレータを作成しようとしています。を使用してこれは可能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(...); }
...
};