Salut tout le monde !
Je bloque sur un problème de conception. Je dois faire une fabrique de template. Histoire de clarifier un peu les choses, voici, en gros, ce que je dois faire.
Soit IBase une classe de base déclarée comme suit :
Soit une classe ITBase déclarée comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class IBase { private: // constructeur par recopie et opérateur d'affectation public: IBase(); virtual ~IBase(); };
... et enfin, soit une classe TBaseImpl déclarée comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 template <typename T> class ITBase : public IBase { private: // constructeur par recopie et opérateur d'affectation public: ITBase(const T& data); virtual ~ITBase(); virtual void OnPrint() const = 0; T& GetData() const; protected: T _data; };
Bon, les noms des classes sont bidons mais c'est juste pour donner une idée représentative d'une partie de la hiérarchie des classes que je dois gérer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 template <typename T> class TBaseImpl : public ITBase<T> { private: // constructeur par recopie et opérateur d'affectation public: TBaseImpl(const T& data); virtual void OnPrint() const; };
J'aimerai implémenter une fabrique qui, à partir d'une chaîne de caractère, me renvoie une instance de ITBaseImpl, un peu de la façon suivante :
Les contraintes sont les suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class TFactory { public: template <typename T> ITBase<T>& GetAReference(std::string& rTypeName); };
* <T> peut être un type parmi de nombreux (un peu plus de 100 types possibles dans mon cas).
* je n'ai pas la possibilité d'utiliser d'autres librairies que les librairies système de Linux et ACE (exit donc boost, loki et autres librairies susceptibles d'apporter une réponse à mon problème)
* les types <T> sont des structures que je ne peux pas modifier
En partant du principe que toutes les instances possibles de TBaseImpl<T> sont instanciées et stockées dans ma fabrique, que la dite fabrique remplie le contrat de la méthode GetAReference, comment faire pour résoudre simplement le problème de la création de toutes les instances de TBaseImpl<T> ?
La solution nulle consiste à laisser la fabrique créer chaque instance et à les stocker dans une map dont la clé est une chaine de caractère. Cette solution ne me convient pas car :
* c'est long et pénible à faire
* la fabrique est impactée à chaque ajout / suppression d'un type <T>
J'ai lu dans différents articles sur le forum que la méta programmation résoud ce problème mais je suis obligé de me faire tout le code (voir dans les contraintes pourquoi) et vu mon niveau c'est un peu trop compliqué.
Est ce que quelqu'un(e) a une idée pour m'aider à trouver une solution correcte ?
D'avance merci.
Partager