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é.