IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C++ Discussion :

les macro intelligents en c++ [question]


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Points : 25
    Points
    25
    Par défaut les macro intelligents en c++ [question]
    salut les développeurs
    j'ai une petite question sur les macro en c++

    j'ai déclaré un macro dans mon code c++ comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define sub(type,nom) type get() { return nom; }
    le macro marche très bien , mais le problème c que je veut appelé ce macro pour tts les attributs de ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class test{
     
    int a; sub(int,i)
    double d ; sub(double,d) <== la ça ne marchera pas 
    ...
    }
    existe il une solution pour faire un seul macro pour tts les attributs du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define sub(type,nom) type get_type(){return nom;}
    j'ai testé cette dernière solution mais ça n'a pas marché

    je voudrai que la macro change le nom de la fonction get pour chaque attribut .

    un grand Merci pour vous

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    normalement avec une classe ça devrait marcher:

    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
    #include <iostream>
     
    using namespace std;
     
    #define sub(type, nom) type get_##nom () { return nom; }
     
    int a, b;
     
    sub(int, a);
     
    int main()
    {
        a = 10;
        b = get_a();
     
        cout << b << endl;
        return 0;
    }
    L'opérateur ## permet de concaténer un argument avec autre chose, voire un autre argument, dans une macro.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Merci bcp pour la réponse
    ca marche parfaitement maintenant
    une autre petite question :

    est ce un macro peut manipuler des tableaux ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define macro(type,nom) get(){ //traitements ici  }
    avec nom un tableau
    merci

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    j'ai trouvé encore mieux pour la fonction d'avant (pas besoin de fournir le paramètre type):

    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
    #include <iostream>
     
    using namespace std;
     
    #define sub(nom) typeof(nom) get_##nom () { return nom; }
     
    int a, b;
     
    sub(a);
     
    int main()
    {
        a = 10;
        b = get_a();
     
        cout << b << endl;
        return 0;
    }
    Sinon, oui, on peut utiliser des [] à côté d'un nom de tableau dans une macro, mais j'ai l'impression de ne pas très bien voir ce que tu veux faire.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    salut
    j'ai testé le truc de typeof(nom) mais apparemment ça n'a pas marcher pour moi

    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
     
    #include<iostream>
    using namespace std;
    #define reflected(Nom) \
    typeof(Nom) get##Nom(){ return Nom;} \
    void set##Nom(typeof(Nom) a){Nom = a;}
     
    class test
    {
        int i ;reflected(i)
        double d ; reflected(d)
    }
     
    void main()
    {
      test T;
      cout<< T.geti();
      T.setd(12.3);
    }
    existe il le macro typeof en c++ ?

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    typeof est une extension de gcc; il va y avoir decltype qui est similaire en C++0X.

    En passant, quand on se met à faire des macros pour faciliter les accesseurs, ça me semble un signe qu'il y en a trop.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    bonjour
    un grand merci pour votre aide
    dans quel fichier est définie le macro decltype ?
    j'ai pas encore testé cette solution ,j'ai fais une recherche sur internet pour ce mot clé mais j'ai pas trouvé grand chose

    je rappelle mon code :

    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
     
     
    #define sub(Nom,type) \
    type get_##Nom(){ return Nom;} \
    void set_##Nom(type a){Nom = a;}
     
    using namespace std;
     
    class Test
    {
    public:
        int i; sub(i,int)
        double d; sub(d,double) 
    };
     
    int main()
    {
        Test T;
        T.set_i(5);
        T.set_d(12.3);
        cout << T.get_i()<<endl;
        cout << T.get_d()<<endl; 
        return 0;
    }
    j'ai encore un petit soucis c'est que je voudrais avoir seulement deux fonctions générales : get et set et qui seront opérationnelles pour toutes les attributs de toutes mes classes .
    quelqu'un a une idée
    Merci mes amis
    à bientôt

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    arf, faire des accesseurs pour le plaisir

    ça marche pour les types de base (POD) mais pour les objets qu'il faut passer en référence const, hein ça va être la fête de la copie de vector.

    Puis tu pourrais mettre le get() const quand même! c'est un minimum.

    Mais au niveau conception, il ne faut pas se dire que tous tes attributs doivent être modifiés avec des accesseurs. Sinon autant tout mettre public, ça ira plus vite que de faire une macro.

    Et pour du code d'entreprise, même si j'en ai fait aussi pour des problèmes particuliers, j'éviterais au max les macros, surtout si elles doivent être systématiques à toutes les classes.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    Merci pour la réponse , c vrai vous avez parfaitement raison les macro sont à éviter au maximum .
    mais ce que je développe actuellement est un parseur de code qui va être opérationnelle pour faire des testes de debug des truc de réfléxions c.à.d savoir l'état de mes classes et de mes variables dans le runtime
    danc je doit avoir des accesseur surtout des geteurs pour mes attribut et en plus ce n'est pas tts les attributs vont avoir des accesseurs get/set seulement les attributs sur lesquels je voudrais faire le test .

    alors avoir deux accesseurs globales sera une solution parfaite

    un grand merci
    à bientot

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    salut

    voici la dernière version de mon code
    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
     
     
    #define sub(Nom,Type) \
    Type get_##Nom(){ return Nom;} \
    void set_##Nom(Type a){Nom = a;}\
    //ici je doit implémenter la solution 
     
    using namespace std;
     
    class Test 
    {
    public:
     
        int i;  sub(i,int)
        double d; sub(d,double) 
        list<string> listproperties;
        bool getClassProperties(list<string> lst);
    };
    explication de la solution que je veut implémenter :

    à chaque fois que je fait l'appelle à la macro reflected(Nom,Type) je veut ajouter le nom de la variable passée en arguments "Nom" à la liste des propriétés listproperties ok .
    mais je trouve pas comment faire pour réaliser cette démarche
    pourriez vous m'aider sur ce coup ?
    merci

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    c'est possible mais pas comme ça dans le .h

    Tu dois pouvoir y arriver en mettant listproperties en static, et en définissant un objet dans le .cpp qui s'occuperait de rajouter des champs dans listproperties lorsqu'il est construit ( au démarrage de l'appli ).

    Enfin ça ça marche à peu près, peut être qu'il y a d'autres façons que je ne connais pas.

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    regarde ce que fait Qt, ils l'ont fait deja.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    un grand merci pour vous

  14. #14
    Nouveau membre du Club
    Inscrit en
    Décembre 2007
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 44
    Points : 25
    Points
    25
    Par défaut
    salut les développeurs
    je poste toujours pour le problème de la reflexion en c++
    j'ai trouvé une API open source ecrite en c++ qui s'appelle reflect voici le lien

    http://www.garret.ru/~knizhnik

    elle réalise des chose incroyables pour la reflexion : extraire les valeurs des champs , modifier les et d'autres choses et tout ca au cours de l'execution du programme .
    je voudrai savoir est ce qlqun a déjà travaillé avec cette API , quels sont les projets qui utilisent cette bibliothèque ?
    merci

Discussions similaires

  1. Question sur les macros compilées
    Par JeromeMATHIAS dans le forum Macro
    Réponses: 3
    Dernier message: 15/10/2012, 22h39
  2. Question sur les macros
    Par aiolia_aiolos dans le forum C++
    Réponses: 3
    Dernier message: 11/04/2008, 11h20
  3. Question d'ordre général sur les macros sur excel
    Par tzehani dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 29/08/2007, 05h16
  4. petite question sur les macros complémentaires
    Par kbakouan dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/07/2007, 15h17

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