Hello !
Je suis en train de coder une classe Vector pour un exo (les profs ont vraiment l'air de l'aimer cet exo, il revient souvent),
et je bloque sur le design des iterators
Actuellement j'ai quelques chose du genreCa me semble correct, bien que j'avais lu (sur StackOverflow il me semble, mais je retrouve plus le lien) que cet héritage n'avait pas lieu d'être et que c'était un hack. Ainsi que c'est le design utilisé dans la STL de Microsoft, mais pas dans celle de GCC.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 template <class T> class Vector { ... public: ... class const_iterator { ... }; class iterator: public const_iterator { ... } };
J'ai essayé de regarder les sources pour vérifier, mais on s'y perd facilement.
Vous en pensez quoi de cet héritage ? Correct ? Peut être remplacé par quelques chose de mieux ?
Ensuite arrivent les reverse_iterator, ma première idée était de faire un héritage en diamant :
(Enfin plutot "carré", vu que d'un point de vu logique, les reverse_iterator et leurs équivalents dans l'autre sens sont "au même niveau".)
Mais la doc indique clairement que ce n'est pas la chose à faire (lien ici):Mais la... pour implémenter cette classe je bloque complétement. Il me faut une spécialisation par conteneur (enfin 2, const et non const) ?Envoyé par doc c++
Car il y a bien à différencier les 2 à un moment
L'héritage en diamant est-il vraiment à éviter ? ou est-ce une solution valable ?
L'idéal serait de n'avoir à fournir que 2 spécialisions (const et non const) et que ça marche avec tous les itérators, mais je me perd dans la syntaxe, c'est possible quelques chose du genre ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template <class I> class reverse_iterator { }; template <class I> class reverse_iterator<I::iterator> { ... };
Partager