adaptateur reverse_iterator

J’essaie d’implémenter un adaptateur pour les classes iterator et const_iterator avec un peu d’ennuis. Si quelqu’un pouvait me guider à travers cela, ce serait grandement apprécié!

L’idée est que je devrais être capable de créer un reverse-iterator à partir de mes appels de fonction rbegin () et rend ()

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

J’utilise les typedef suivants dans la classe:

 typedef btree_iterator iterator; typedef const_btree_iterator const_iterator; typedef reverse_btree_iterator reverse_iterator; typedef reverse_btree_iterator const_reverse_iterator; 

Comme vous pouvez le constater, j’aimerais pouvoir créer des iterators inversés à l’aide de modèles, en donnant à la classe reverse_iterator un iterator ou un const_iterator.

Malheureusement, c’est ce bit sur lequel je suis coincé …

Vous trouverez ci-dessous la définition de classe que j’ai actuellement, avec des erreurs.

 template  class reverse_btree_iterator { typedef ptrdiff_t difference_type; typedef bidirectional_iterator_tag iterator_category; public: reverse_btree_iterator() : base_(I()) {} template  reverse_btree_iterator(const btree_iterator& 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_; }; 

Je n’ai jamais utilisé de modèles de ce genre auparavant, il est donc fort probable que je ne comprenne pas très bien comment ils peuvent être utilisés …

Puisque je peux être un iterator ou un const_iterator, le typedef de référence et le pointeur varient entre les deux classes. Les lignes qui ne comstacknt pas sont les suivantes:

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

Je ne sais pas comment faire en sorte que la seule classe reverse_iterator fonctionne à la fois pour iterator et const_iterator si je ne suis pas capable de faire I :: reference et I :: pointeur. J’ai aussi essayé d’append des modèles devant ceux-ci, car ils sont définis dans la classe iterator (par exemple) comme:

 typedef T* pointer; typedef T& reference; 

référence et pointeur sont des noms dépendants, vous devez donc utiliser

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

De plus, le constructeur doit accepter uniquement le I

Cependant, il n’est pas nécessaire d’écrire cette classe du tout. La bibliothèque standard a reverse_iterator pour cela. Ou si vous n’êtes pas satisfait de cela, il y a aussi Boost.ReverseIterator .

Tout ce qu’il faut c’est juste

 typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; 

De plus, vous avez oublié de fournir aux opérateurs de comparaison d’autres iterators inversés du même type. Il s’agit d’une exigence d’iterator inversé.