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;}
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...)
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:
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.
Frédéric Mayot <toto@toto.com> wrote in message news:<3f9f07a4$0$27594$626a54ce@news.free.fr>...
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>;}
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:
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)
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:
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.
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: