Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1265 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1783690
Olivier51
Posté le 07-09-2008 à 20:33:09  profilanswer
 

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

mood
Publicité
Posté le 07-09-2008 à 20:33:09  profilanswer
 

n°1783701
Joel F
Real men use unique_ptr
Posté le 07-09-2008 à 21:06:13  profilanswer
 

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 ;)

n°1783708
Olivier51
Posté le 07-09-2008 à 21:50:59  profilanswer
 

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
n°1783710
Joel F
Real men use unique_ptr
Posté le 07-09-2008 à 21:56:58  profilanswer
 

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
n°1783711
Olivier51
Posté le 07-09-2008 à 22:04:32  profilanswer
 

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

n°1783713
Joel F
Real men use unique_ptr
Posté le 07-09-2008 à 22:07:45  profilanswer
 

ca reste moche :/


Message édité par Joel F le 07-09-2008 à 22:08:21
n°1783714
Olivier51
Posté le 07-09-2008 à 22:11:30  profilanswer
 

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>();

n°1783717
Joel F
Real men use unique_ptr
Posté le 07-09-2008 à 22:22:55  profilanswer
 

ou faire un vrai pattern Factory


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
macro pour jeuxvideo aide!Import Access fichier 'txt' à modifier via macro ...
[VBA EXCEL 2007] macro ultra lenteMacro qui 'executent toutes seules??
appel d'un template xsl-fo ![RESO]problème d'affichage apres selection d'une cellule via une macro
Newbee - template fluide à 100% avec des DIV[VBA Excel] Activer l'écriture manuscrite par macro sur Tablet PC
Aide avec Macro ExpertMacro Exportation
Plus de sujets relatifs à : Manipulation d'un nom de template dans une #define-macro


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR