Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 63
    Points : 48
    Points
    48

    Par défaut récupérer un string dans une macro

    Bonjour a tous,

    Je souhaiterai savoir si il est possible dans une classe template d'avoir une macro capable de créer une méthode de classe sous la forme void read_[Type template] du template. Elle serait utilisé par des méthodes du template.
    Je précise que je suis tout a fait d'accord avec le fait qu'une classe template avec une méthode template ferait très bien l'affaire: en effet puisque en fonction du type passé en paramètre j'aurais une fois mon template instancier une méthode avec un nom généric associé a mon type template du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template<typename T> void read(T data);
    L'idée étant que l'utilisateur qui utilise la classe Composant déclare des méthodes read_[Type] qui soient appelées dans la classe template dataTest dans la méthode run.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void read_TypeData(TypeData data);
    voici ce que j'ai jusqu'a present :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include <string>
    #include <typeinfo>
    #include <iostream>
    #include <algorithm>
     
      class DebugVal
      {
        public:
          DebugVal(){};
          ~DebugVal(){};
      };
     
      class Component
      {
        public:
          Component(){};
          ~Component(){};
     
          void read_DebugVal();
     
      };
     
      template<class C, typename T>
      class dataTest
      {
        public:
          dataTest(C* pComponent): _pComponent(pComponent){};
          ~dataTest(){};
     
          static std::string GetName()
          {
            std::string nameOfType(typeid(T).name());
            nameOfType.erase(std::remove_if(nameOfType.begin(), nameOfType.end(), &isdigit),nameOfType.end());
            return nameOfType;
          }
     
          #define type dataTypeName
          #define MAKE_SIGNATURE_FUNCTION_NAME(x) void read_##x()
          #define SIGNATURE_FUNCTION_FROM_TYPE(type) MAKE_SIGNATURE_FUNCTION_NAME(type)
          #define MAKE_BODY_FUNCTION_NAME(x) read_##x()
          #define BODY_FUNCTION_FROM_TYPE(type) MAKE_BODY_FUNCTION_NAME(type)
     
          MAKE_SIGNATURE_FUNCTION_NAME(type)
          {
              return;
          }
     
          C* _pComponent;
     
     
          void run()
          {
            _pComponent->MAKE_BODY_FUNCTION_NAME(type);
          }
     
     
     
      };
     
     
    int main(int argc, char **argv) {
     
      Component component;
      dataTest<Component, DebugVal> test(&component);
      test.MAKE_BODY_FUNCTION_NAME(DebugVal);
     
    	return 0;
    }
    et voici ce que la sortie préprocesseur me donne :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
     
     class DebugVal
      {
        public:
          DebugVal(){};
          ~DebugVal(){};
      };
     
      class Component
      {
        public:
          Component(){};
          ~Component(){};
     
          void read_DebugVal();
     
      };
     
      template<class C, typename T>
      class dataTest
      {
        public:
          dataTest(C* pComponent): _pComponent(pComponent){};
          ~dataTest(){};
     
          static std::string GetName()
          {
            std::string nameOfType(typeid(T).name());
            nameOfType.erase(std::remove_if(nameOfType.begin(), nameOfType.end(), &isdigit),nameOfType.end());
            return nameOfType;
          }
     
          void read_type()
          {
          }
     
          C* _pComponent;
     
     
          void run()
          {
            _pComponent->read_type();
          }
     
     
     
      };
     
     
     
     
    int main(int argc, char **argv) {
     
      Component component;
      dataTest<Component, DebugVal> test(&component);
      test.read_DebugVal();
     
     return 0;
    }
    Ce que je souhaite c'est qu'a la place d'avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          void run()
          {
            _pComponent->read_type();
          }
    avoir (dans le cas d'un type template DebugVal) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          void run()
          {
            _pComponent->read_DebugVal();
          }

  2. #2
    Membre expert
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    avril 2016
    Messages
    744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : avril 2016
    Messages : 744
    Points : 3 262
    Points
    3 262

    Par défaut

    Bonjour,
    C'est impossible avec des macros. Le préprocesseur n'instancie pas les templates. En particulier, il n'instancie pas dataTest<Component, DebugVal>. Donc il ne sait à aucun moment que le paramètre de template T reçoit DebugVal en argument.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    Consultant informatique
    Inscrit en
    octobre 2004
    Messages
    10 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : octobre 2004
    Messages : 10 886
    Points : 25 392
    Points
    25 392

    Par défaut

    Salut,

    De manière générale, il y a très peu de choses que tu puisse faire avec des macros que tu ne puisse pas faire autrement

    En plus, les macros sont l'enfer de quatre manières différentes (suit les liens evil#2, evil#3 et evil#4 pour les trois dernières raisons )

    En un mot comme en cent : évite l'utilisation des macros, à l'exception de ceux pour lesquels tu n'as absolument pas d'autre choix (comme les directive #include, #pragma one et autre gardes anti inclusion multiples )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2010
    Messages : 63
    Points : 48
    Points
    48

    Par défaut

    Bonjour,

    merci pour vos retours, je me contenterai de simples méthodes surchargées

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer nom d'une table dans une macro-variable
    Par joyeux_lapin13 dans le forum Macro
    Réponses: 5
    Dernier message: 02/11/2011, 10h03
  2. [XL-2007] Récupérer résultat d'une requête dans une macro
    Par guigui69 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/05/2011, 18h04
  3. Récupérer nom d'une variable dans une macro
    Par Filippo dans le forum Macro
    Réponses: 2
    Dernier message: 01/10/2009, 12h26
  4. récupérer un fichier dans une string
    Par barhili04 dans le forum C#
    Réponses: 3
    Dernier message: 17/05/2007, 17h49
  5. Réponses: 6
    Dernier message: 18/10/2006, 16h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo