unifier les itérateurs ...

unifier les itérateurs ... - C++ - Programmation

Marsh Posté le 28-06-2006 à 18:33:33    

Bonjour,
 
J'essaye d'unifier différents types d'itérateurs afin de simplifier l'interface de plusieurs classes containers. Concrètement, voici (en essence) ce que j'ai tenté :
 

Code :
  1. class A {...};
  2. typedef std::iterator<std::bidirectional_iterator_tag, A> A_iterator;
  3. class B {
  4. private:
  5.   std::vector<A> v;
  6.   std::set<A> s;
  7. public:
  8.   A_iterator v_begin() {return v.begin();}
  9.   ...
  10.   A_iterator s_end() {return s.end();}
  11. };


 
Dans le but de remplacer les vector<A>::iterator et set<A>::iterator par des A_iterator (unification pour l'utilisateur, et encapsulation qui fait que l'utilisateur n'a pas besoin de savoir qu'un B est implémenté par un vector+set pour s'y promener ...)
 
Malheureusement, le compilo refuse de caster le type d'itérateur retourné par v.begin() en un A_iterateur, même explicitement.
 
Une idée, un conseil, une astuce (voire soluce) ?
 
Merci d'avance !
 
-- ZZ

Reply

Marsh Posté le 28-06-2006 à 18:33:33   

Reply

Marsh Posté le 28-06-2006 à 19:47:31    

meme si tu pouvais je vois pas l'interet, montre un exemple de code appelant souhaité

Reply

Marsh Posté le 28-06-2006 à 19:57:11    

tu veux passer un iterateur générique d'un conteneur générique en itérateur typé ? ca ne serait pas une regression ?


Message édité par _darkalt3_ le 28-06-2006 à 19:57:27

---------------
Töp of the plöp
Reply

Marsh Posté le 28-06-2006 à 20:12:51    

je penses qu'il veut faire
B::iterator i = <b.v_begin() ou b.s_begin()>;
 
mais bon c'est pas comme ca qu'on fait, suffit de voir les algorithmes standard, tout ce qu'on attend d'un iterateur c'est d'avoir l'interface d'un pointeur et apres c'est template & co qui genere du code avec des ++ et des * pour les algos génériques
 
suffit de faire
mon_algo(<b.v_begin() ou b.s_begin()>, ...);
et ca roule

Reply

Marsh Posté le 28-06-2006 à 20:28:00    

tu peux facilement faire un petit iterator d'emballage par dessus. le plus petit commun étant le forward iterator il me semble, en généralisant, tu perds en fonctionnalités (pas d'accès aléatoire sur le set)

Reply

Marsh Posté le 28-06-2006 à 21:01:33    

skelter a écrit :

meme si tu pouvais je vois pas l'interet, montre un exemple de code appelant souhaité


 
Dans l'idée, il s'agit juste d'avoir un type itérateur (paramétré par le type d'élement "pointé" par l'itérateur) :
 

Code :
  1. template < class D > class bi_iterator : public std::iterator<std::bidirectional_iterator_tag, D>{};


 
qui remplace (ou encapsule) n'importe quel itérateur de containers.
 
Intuitivement, je sens bien que ça coince car il faut faire correspondre les opérations sur les bi_iterator (++, *, etc.) avec les mêmes opérations sur des types d'itérateurs différents qui sont "implementation defined" (dixit la doc STL), mais n'y-a-t'il pas un moyen autre de parvenir à mes fins ?
 
Un exemple d'appli : construire une structure de graphe et utiliser des itérateurs sur les noeuds et les arêtes que l'utilisateur puisse utiliser sans avoir besoin de savoir que le graphe est implémenté par des set ou des vector ou encore des list ... vous allez me dire : suffit de faire des itérateurs de la classe graphe, mais si d'autres classes stockent aussi des noeuds ou des arêtes, j'aimerais qu'elles utilisent les mêmes itérateurs !
 
-- ZZ

Reply

Marsh Posté le 28-06-2006 à 22:44:22    

et bien défini ton propre itérateur. j'ai écris un petit truc dessus dans les sujets utiles si je me souviens.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed