J'aimerai utiliser un type polymorphique dont chaque sous-type possède son propre opérateur < (operator< ) comme 'key' d'un map.
Mais le problème c'est qu'on ne peut pas donner de type pointeur comme 'key' (map<KeyType*, ...> ) donc mon 'key' que je donnerai lors d'une recherche (m[key]) sera automatiquement casté vers son parent 'KeyType' et donc c'est l'opérateur < du parent qui sera appellé.
J'aimerai utiliser cela pour créer des index (map) sur une table contenant des enregistrements et le but est que l'index puisse s'appliquer à différents type (int, long, str, etc..).
voila mon code :
Fichier 'main.cpp'
Code :
- /**
- * Fichier principal de test des tables en mémoire
- */
- //désactive le warning 4786 (bug de krosoft avec les 'map' pour changer un peu)
- #pragma warning(disable : 4786)
- #include <iostream>
- #include <vector>
- #include <map>
- #include <list>
- #include <string>
- using namespace std;
- #include "baseType.h"
- int main(int argc, char** argv)
- {
- //exemple d'utilisation d'index
- //les définitons de type
- typedef vector<BaseType*> Record;
- typedef list<Record> Table;
- typedef map<BaseType, Record> Index;
- //la table
- Table table;
- //création de trois enregistrements
- Record e1(2), e2(2), e3(2);
- e1[0] = new Char('a');
- e1[1] = new Int(1);
- e2[0] = new Char('b');
- e2[1] = new Int(2);
- e3[0] = new Char('c');
- e3[1] = new Int(3);
- //on insère les trois enregistrements (lignes)
- table.push_back(e1);
- table.push_back(e2);
- table.push_back(e3);
- //création d'un index sur le premier champs
- Index index;
-
- //on insère successivement les enregistrements dans l'index
- for(Table::iterator i = table.begin(); i != table.end(); i++)
- {
- index[*((*i)[0])] = (*i);
- }
-
- //affichage de la ligne dont le champs 0 est 'b'
- Record r = index[Char('b')];
- cout << r[0]->getChar() ;//<< "|" << r[1]->getInt() << endl;
- return 0;
- }
|
Fichier 'baseType.h' (je n'ai écrit le code que pour les type int et char)
Code :
- /**
- * Représente une valeur de base : char, int, long, double, str
- */
- #include <string>
- #include <iostream>
- using namespace std;
- class BaseType
- {
- public:
- /**
- * les opérateurs d'affectation pour les différents types.
- */
- virtual BaseType& operator=(char){return *this;};
- virtual BaseType& operator=(int){return *this;};
- virtual BaseType& operator=(long){return *this;};
- virtual BaseType& operator=(double){return *this;};
- virtual BaseType& operator=(string){return *this;};
- /**
- * les accesseurs.
- */
- virtual char getChar() const{return 0;};
- virtual int getInt() const{return 0;};
- virtual long getLong() const{return 0;};
- virtual double getDouble() const{return 0.0;};
- virtual string getString() const{return "";};
- /**
- * les comparaisons
- */
- virtual bool operator<(const BaseType& c) const{ cout << "plus petit BaseType " << endl; return false; }
- };
- /**
- * Représente un caractère.
- */
- class Char : public BaseType
- {
- public:
- Char(char c):v(c){};
- BaseType& operator=(char);
- char getChar() const;
- bool operator<(const BaseType& c) const{ cout << "plus petit Char" << endl; return this->v < c.getChar(); }
- private:
- char v;
- };
- /**
- * Représente un entier.
- */
- class Int : public BaseType
- {
- public:
- Int(int c):v(c){};
- BaseType& operator=(int);
- int getInt() const;
- bool operator<(const BaseType& c) const{ cout << "plus petit Int" << endl; return this->v < c.getInt(); }
- private:
- int v;
- };
|
Fichier baseType.cpp
Code :
- #include "baseType.h"
- BaseType& Char::operator=(char v)
- {
- this->v = v;
- return *this;
- }
- char Char::getChar() const
- {
- return this->v;
- }
- BaseType& Int::operator=(int v)
- {
- this->v = v;
- return *this;
- }
- int Int::getInt() const
- {
- return this->v;
- }
|
Je précise que mon code est compilable mais affiche :
plus petit BaseType
plus petit BaseType
plus petit BaseType
plus petit BaseType
plus petit BaseType
plus petit BaseType |
Mon but serait qu'il utilise les opérateurs < des classes enfants, si vous avez une solution n'hésitez pas (même si elle n'a plus rien a voir avec ce que j'ai fait) !
Message édité par Ummon le 17-03-2004 à 18:30:24