Manipulation d'un nom de template dans une #define-macro

Manipulation d'un nom de template dans une #define-macro - C++ - Programmation

Marsh Posté le 07-09-2008 à 20:33:09    

Voila, je voudrais accéder à une variable globale pré-définie (je sais que cette variable existe et suit un certain format). Donc du genre :

Code :
  1. #define GET_TYPE(X) g##X##Type


 
Maintenant, un peu plus dur, je voudrais utiliser cette macro dans un template

Code :
  1. template<class A, class B>
  2. class MyTemplate {
  3. int getType() { return GET_TYPE(A); }
  4. };


 
Et là,c'est le drame ...  [:chrisbk]  

Code :
  1. /tmp/template.hpp:35: error: 'gAType' was not declared in this scope

Reply

Marsh Posté le 07-09-2008 à 20:33:09   

Reply

Marsh Posté le 07-09-2008 à 21:06:13    

tu veut faire quoi exactement. Parce que la deja v_v macro+globale, ca sent le sapin.
donc donne moi le details de ton truc.
 
Ton truc marchera jamais anyway ;)

Reply

Marsh Posté le 07-09-2008 à 21:50:59    

Par exemple, j'ai un template Model qui prend en parametre (de template) deux classes

Code :
  1. template<class A, class B>
  2. class Model {
  3. A* Create() { new A(); }
  4. };


 
Je sais que pour toutes classe A, il existe :
- une classe AType
- un unique objet global défini ainsi : Model<A,AType>* gpAModel = new gpAModel<A,AType>();
 
J'ai ainsi défini :

Code :
  1. #define GET_MODEL(T) g##T##Model<T,T##Type>


 
Maintenant, je voudrais dans un template de classe MyTemplate accèder à cette variable globale :

Code :
  1. template<class C>
  2. class MyTemplate {
  3. C* Do() {
  4.  return GET_MODEL(C)->Create();
  5. }
  6. };


 
Pour ainsi écrire simplement

Code :
  1. MyTemplate<A> var;
  2. A* pA = var->Do();


Message édité par Olivier51 le 07-09-2008 à 21:51:26
Reply

Marsh Posté le 07-09-2008 à 21:56:58    

oui mais non. Un paramètres template n'est aps un token d epreprocessing.
Utilise plutot des traits en faisant une table de correspondance entre ton A et ton Model de A.

 
Code :
  1. template<class T> struct model;
  2. template<> struct model<A>
  3. {
  4.   typedef AType type;
  5.   static inline type Get() { return gpAModel; }
  6. };
 

Surcharge en suite model pour chaque type que tu connais.
Puis pour récupérer le model dans ta classe :

 
Code :
  1. template<class X> struct myTemplate
  2. {
  3.   X* create() { return model<X>::Get()->Create(); }
  4. }
 

Mais ton schéma est zarb, et les globales c'ets la merde assurée.

 

C'est une abstract factory que tu veut faire ou bien ?


Message édité par Joel F le 07-09-2008 à 21:57:46
Reply

Marsh Posté le 07-09-2008 à 22:04:32    

J'ai fait un peu de refactoring dernierement, et j'ai ainsi déplacer la variable statique dans Model :
Par exemple, j'ai un template Model qui prend en parametre (de template) deux classes

Code :
  1. template<class A, class B>
  2. class Model {
  3. A* Create() { new A(); }
  4. static Model<A,C>* gpModel;
  5. };


 
+ Spécialization de ce template pour chaque object, ainsi :

Code :
  1. template<>
  2. class Model<A,AType> {
  3. A* Create() { new A(); }
  4. static Model<A,AType>* gpModel;
  5. };
  6. Model<A,AType>* gpModel = new Model<A,AType>();


 
Je peux ainsi accèder à cette variable globale, en appellant Model<A,AType>::gpModel ... Mais j'ai encore besoin de concaténation pour "créer" le AType à partir de A :

Code :
  1. #define GET_MODEL(T) Model<T,T##Type>::gpModel

Reply

Marsh Posté le 07-09-2008 à 22:07:45    

ca reste moche :/


Message édité par Joel F le 07-09-2008 à 22:08:21
Reply

Marsh Posté le 07-09-2008 à 22:11:30    

Oups, je viens de voir ta réponse ... En fait, à la base, je voulais garder un truc générique pour éviter d'obliger à faire un spécialization pour chaque objet ... Mais comme maintenant, j'ai commencé à spécializer autant aller jusqu'au bout ...
Je pense que je vais mixer ta proposition et ma refactoring pour avoir un truc du genre :
 

Code :
  1. template<class A>
  2. class Model {
  3. A* Create() { new A(); }
  4. size_t TypeSize() { return 0;}
  5. static Model<A>* gpModel;
  6. };
  7. template<>
  8. class Model<A> {
  9. A* Create() { new A(); }
  10. size_t TypeSize() { return size(AType);}
  11. static Model<A>* gpModel;
  12. };
  13. Model<A>* Model<A>::gpModel = new Model<A>();

Reply

Marsh Posté le 07-09-2008 à 22:22:55    

ou faire un vrai pattern Factory

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed