Forum Programmation.c++ Convertion d'iterateur

Posté par  .
Étiquettes : aucune
0
15
avr.
2005
Salut les gens,

J'ai deux classes :
class Mere {};
class Fille : public Mere {};

Et un container de pointeurs vers des instances de class Fille :
std::vector<Fille*> filles;

J'aimerais savoir si je peux convertir un const_iterator sur un vector<Fille*> en un const_iterator sur un vector<Mere*> :

std::vector<Mere*>::const_iterator i = filles.begin();

Je sais qu'il y a moyen de faire croire au compilateur (en l'occurence gcc3.2.3) qu'il y a une relation d'heritage entre les 2 containers (de la meme maniere qu'il y a une relation d'heritage entre les 2 classes), mais cela tient du vrai hack immonde, ce n'est pas ce qu'il y a de plus portable et ca ne marche pas avec l'heritage multiple.

Il me semblait que, comme je n'ai que des vecteurs de pointeurs, je n'avais pas a me preoccuper des offsets qu'il y a entre classes de base et derivee, et donc qu'en laissant faire l'heritage, je devrais pouvoir arriver a m'en sortir...

Mais :

../src/toto.cxx: In member function `int main()':
../src/toto.cxx:20: conversion from `__gnu_cxx::__normal_iterator<Fille**,
std::vector<Fille*, std::allocator<Fille*> > >' to non-scalar type `
__gnu_cxx::__normal_iterator<Mere* const*,
std::vector<Mere*, std::allocator<Mere*> > >' requested

Faudrait-il que je definisse explicitement quelque part un convertisseur entre les iterateurs ?
Vu le message d'erreur, je sens que c'est un truc tout bete.

Une idee ?

PS : J'ai aussi regarde du cote de boost::iterator_adaptor et boost::iterator_facade mais bon... Je suis rapidement arrive a mon niveau d'incompetence.
  • # Pfff

    Posté par  . Évalué à 2.

    Ouais... Je suis encore tombé dans le piège de la conversion non autorisée Fille** -> Mere**

    Autant pour moi...

    Par contre je me demandais si avec des const un peu partout et des reinterpret_cast au petit bonheur la chance dans un savant geste de saupoudrage, il n'y aurait pas moyen de moyenner. C'est vrai quoi ! Tout ce que je demande c'est un acces en lecture simple. Pas d'écriture :/
    • [^] # Re: Pfff

      Posté par  . Évalué à 2.

      Pour la posterite : j'y suis arrive :)

      L'astuce c'est de creer des iterateurs polymorphiques et de calquer l'arbre d'heritage des iterateurs sur celui des objets sur lesquels ils iterent.
      Ensuite, il suffit de surcharger le typedef const_iterator des conteneurs par une reference vers l'iterateur polymorphique.

      Chafouin mais ca marche.
      Moi etre vraiment trop content.

      PS : boost::transform_iterator est ton ami.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.