OVH Cloud OVH Cloud

RTTI ou pas ?

3 réponses
Avatar
Frédéric Mayot
Bonjour,

Encore un petit souci :

Soit MonTempl une classe template collection de pointeurs d'instances :
template<class T>
class MonTempl
{
set<T*> ma_collec;
bool Cherche(string);
};

Soient A, B et C trois classes dérivées de MaBase :
class MaBase;
class A : public MaBase{};
class B : public MaBase{};
class C : public MaBase{};

Soit D, (enfin !) une classe qui contient des instances de MonTempl :
class D
{
MonTempl<A> m1;
MonTempl<B> m2;
MonTempl<C> m3;

MonTempl<A>* get_m1();
MonTempl<B>* get_m2();
MonTempl<C>* get_m3();
};
D est une collection (de longueur fixe) de collections.

J'ai l'impression que c'est vaguement redondant, car on a un mappage
type T/collection de pointeurs d'instances de T.

A l'utilisation, j'aurais plutôt voulu quelque chose du genre
D monD;
D.get<A>()->Cherche("toto");

plutôt que

D monD;
D.get_m1()->Cherche("toto");

et ne pas avoir à créer une donnée membre par type explicitement (ce qui
peut être contraignant si j'ai un nombre fixe mais important de
MonTempl<X> dans monD.)

Donc mon idée est la suivante :

class D
{
hash_map<std::type_info, MonTempl<MaBase>* > collections;

template<class T>
MonTempl<T>* ajoute_collection<T>(){collections[typeid(T)] = new T;}

template<class T>
MonTempl<T>* get<T>(){return collections[typeid(T)];}
};

Je sais pas trop si ce bazard marche ou non, mais ça donne au moins une
idée. Le seul problème, c'est côté performance. Avant j'avais juste une
indirection, maintenant j'ai une recherche dans une table de hachage...

Disons que ça n'est pas le sommum. Existe-t-il une autre manière de
procéder pour aboutir à ce que je veux. (Là, je peux ajouter de manière
dynamique des collections, mais je ne le cherche pas forcément).

Tout ça n'est probablement pas bien clair, mais je fais surement une
erreur quelque part dans ma conception (ou alors je me casse trop la
tête, ce qui est une autre histoire...)

Merci par avance.

Fred

3 réponses

Avatar
tib.motuelle
Frédéric Mayot wrote in message news:<3f9f07a4$0$27594$...
Bonjour,

Encore un petit souci :

Soit MonTempl une classe template collection de pointeurs d'instances :
template<class T>
class MonTempl
{
set<T*> ma_collec;
bool Cherche(string);
};

Soient A, B et C trois classes dérivées de MaBase :
[snip]


Soit D, (enfin !) une classe qui contient des instances de MonTempl :
class D
{
MonTempl<A> m1;
MonTempl<B> m2;
MonTempl<C> m3;

MonTempl<A>* get_m1();
MonTempl<B>* get_m2();
MonTempl<C>* get_m3();
};
D est une collection (de longueur fixe) de collections.

[snip]


Donc mon idée est la suivante :

class D
{
hash_map<std::type_info, MonTempl<MaBase>* > collections;

template<class T>
MonTempl<T>* ajoute_collection<T>(){collections[typeid(T)] = new T;}


Tu veux dire:
void ajoute_collection<T>(){collections[typeid(T)] = new
MonTempl<T>;}



template<class T>
MonTempl<T>* get<T>(){return collections[typeid(T)];}
};

Je sais pas trop si ce bazard marche ou non, mais ça donne au moins une
idée. Le seul problème, c'est côté performance. Avant j'avais juste une
indirection, maintenant j'ai une recherche dans une table de hachage...


Oui ca devrait marcher. Si les performances t'inquiètent, pourquoi ne
pas cacher le résultat de la recherche, du genre:

template<class T>
MonTempl<T>* get<T>()
{
static MonTempl<T>* collection = collections[typeid(T)];
return collection;
}

Disons que ça n'est pas le sommum. Existe-t-il une autre manière de
procéder pour aboutir à ce que je veux. (Là, je peux ajouter de manière
dynamique des collections, mais je ne le cherche pas forcément).


N'oublie pas d'écrire le destructeur de D (faire le ménage dans tes
collections)

Bertrand.

Avatar
Frédéric Mayot
Tu veux dire:
void ajoute_collection<T>(){collections[typeid(T)] = new
MonTempl<T>;}


Oui bien sûr, il se faisait tard...

Oui ca devrait marcher. Si les performances t'inquiètent, pourquoi ne
pas cacher le résultat de la recherche, du genre:

template<class T>
MonTempl<T>* get<T>()
{
static MonTempl<T>* collection = collections[typeid(T)];
return collection;
}


Oui effectivement, pourquoi pas.

Avatar
Benoit Rousseau
Bertrand Motuelle wrote:

Oui ca devrait marcher. Si les performances t'inquiètent, pourquoi ne
pas cacher le résultat de la recherche, du genre:

template<class T>
MonTempl<T>* get<T>()
{
static MonTempl<T>* collection = collections[typeid(T)];
return collection;
}



static "cache" la valeur de la map ?
et pour tous les types une fois que la fonction a été appelée ?
Interessant...

Est ce que les templates signifie que la classe est dupliquée pour
chaque type utilisé ? Comment ça marche pour les classes template de la
stl ?

--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/