reverse_iterator adapter

Я пытаюсь реализовать адаптер обратного итератора для моих классов iterator и const_iterator с небольшими проблемами. Если кто-нибудь может помочь мне в этом, буду очень признателен!

Идея заключается в том, что я должен иметь возможность создавать обратный итератор из вызовов функций rbegin() и rend()

reverse_iterator rbegin();
reverse_iterator rend();
const_reverse_iterator rbegin() const;
const_reverse_iterator rend() const;

Я использую в классе следующие typedef'ы:

typedef btree_iterator<T> iterator;
typedef const_btree_iterator<T> const_iterator;
typedef reverse_btree_iterator<iterator> reverse_iterator;
typedef reverse_btree_iterator<const_iterator> const_reverse_iterator;

Как вы видите, я хотел бы иметь возможность создавать обратные итераторы с помощью шаблонов, передавая классу reverse_iterator либо итератор, либо const_iterator.

К сожалению, именно на этом я и застрял...

Ниже приведено определение класса, которое у меня сейчас есть, с ошибками.

template <typename I> class reverse_btree_iterator {

  typedef ptrdiff_t                     difference_type;
  typedef bidirectional_iterator_tag    iterator_category;

public:

  reverse_btree_iterator() : base_(I()) {}
  template <typename T> reverse_btree_iterator(const btree_iterator<T>& rhs) : base_(rhs) {}

  I base() { return base_; }

  I::reference operator*() const;
  I::pointer operator->() const;
  I& operator++();
  I operator++(int);
  I& operator--();
  I operator--(int);
  bool operator==(const I& other) const;
  bool operator!=(const I& other) const;

private:

  I base_;

};

Я никогда раньше не использовал подобные шаблоны, поэтому вполне вероятно, что я совершенно не понимаю, как их можно использовать...

Так как я могу быть итератором или const_iterator, типичные определения ссылки и указателя различаются между этими двумя классами. Строки, которые не компилируются, следующие:

I::reference operator*() const;
I::pointer operator->() const;

Я не уверен, как еще я могу заставить один класс reverse_iterator работать и для iterator, и для const_iterator, если я не могу сделать I::reference и I::pointer. Я также попробовал добавить шаблон перед ними, поскольку они определены в классе iterator (например) как:

typedef T*                            pointer;
typedef T&                            reference;
7
задан Lightness Races with Monica 21 October 2011 в 10:01
поделиться