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 Sebastien . Évalué à 2.
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 Sebastien . Évalué à 2.
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.