unifier les itérateurs ... - C++ - Programmation
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é
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 ?
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
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)
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 :
|
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
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.
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é :
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