Bonsoir,

J'ai une multimap de type :
pour faire un médiateur.

A étant une classe de base virtuelle ayant notamment une donnée membre qui me permet d'établir une relation d'ordre.
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 :

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 :((
et avoir plutôt :

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();
J'ai bien pensé à une solution genre :
- 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 .