Bonsoir,
J'ai une multimap de type :
pour faire un médiateur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part multimap<A*,A*> listA
A étant une classe de base virtuelle ayant notamment une donnée membrequi me permet d'établir une relation d'ordre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part string name
Soient B, C des classes filles.
J'ai donc défini un operator < ( qui s'appuie sur le nom name) et tout marche bien quand je veux récupérer une clef précise.
Seulement voilà, je voudrai savoir s'il y a moyen d'utiliser un equal_range qui ne s'appuie pas sur cet opérateur < qui me permettrait par exemple d'afficher que les objets de type B*.
J'aimerai donc éviter du code comme ceci :
et avoir plutôt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 typedef multimap<A*,A*> listA; typedef listA :: const_iterator MIT; for (MIT mit = listA.begin(); mit != listA.end(); ++mit) { const pair<const A*,const A*> p = *mit; if (dynamic_cast<const B*>(p.first)) p.second->display(); // ParEx }; // Un peu embêtant quand il n'y a que 3 ou 4 objets concernés sur 150 :((
J'ai bien pensé à une solution genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 pair<MIT,MIT> p = listA.equal_range(/* objet foncteur approprié? */); for (MIT mit=p.first;mit!=p.second;++mit) mit->second->display();
- Oh ben suffit de faire commencer les noms de la classe A par "A" etc... mais bon c'est pas très fiable ... et je suis sûr qu'il y a une façon propre et efficace .
Partager