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

Langage C++ Discussion :

Virgule dans une macro


Sujet :

Langage C++

  1. #1
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut Virgule dans une macro
    Bonjour,

    J'ai une macro que nous appelerons MACRO définie ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define MACRO( derived, base ) \
        struct derived : base
    Je souhaite l'utiliser de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template< typename T1, typename T2 >
    MACRO( my_derived, my_base< T1, T2 > )
    {};
    Bien sûr la virgule entre T1 et T2 ne plait pas au pré-processeur.

    Je suppute qu'il n'y a pas de solution, y compris en modifiant éventuellement la macro (enfin la ligne #2, parce que la #1 est inaltérable) ?

    Merci !

    MAT.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MACRO( my_derived, (my_base< T1, T2 >) )
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Du coup ça fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template< typename T1, typename T2 >
    struct my_derived : (my_base< T1, T2 >)
    {};
    Et :
    syntax error : '('
    MAT.

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define MACRO2PARAMS( derived, base, t1, t2 ) \
        struct derived : base< t1, t2 >
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T1, typename T2>
    MACRO2PARAMS( my_derived, my_base, T1, T2)
    Cela dit, je ne suis pas sur de comprendre l'intérêt d'une telle macro...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define MACRO2PARAMS( derived, base, t1, t2 ) \
        struct derived : base< t1, t2 >
    Malheureusement, je ne peux pas modifier la déclaration des paramètres de la macro (i.e. la ligne #1)...

    Citation Envoyé par dragonjoker59 Voir le message
    Cela dit, je ne suis pas sur de comprendre l'intérêt d'une telle macro...
    Tu te doutes que je l'ai simplifiée pour extraire un exemple qui se limite au problème que je rencontre.

    MAT.

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Alors il ne te reste plus que le typedef (évidemment impossible si tu ne connais pas T1 ou T2)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Invité
    Invité(e)
    Par défaut
    Il y une astuce que j'ai vu dans gcc qui utilise les macros variadiques... Par contre je ne me souviens plus où ni comment ils faisaient... Sinon tu peux peut-être voir du coté de boost.PP

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Tu dois pouvoir t'en sortir avec Boost.Preprocessor

  9. #9
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define COMMA ,
    template< typename T1, typename T2 >
    MACRO( my_derived, my_base< T1 COMMA T2 > )
    {};
    mais ca pique les yeux

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    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
    #include<boost/preprocessor.hpp>
     
     
    template<class T1>
    struct my_base1{};
     
     
    template<class T1, typename T2>
    struct my_base2{};
     
    template<class T1, typename T2,typename T3>
    struct my_base3{};
     
    // mon code
    #define MACRO( derived, card, base ) \
        struct derived : BOOST_PP_TUPLE_REM(card) base
     
     
    template< typename T1>
    MACRO( my_derived1, 1,(my_base1< T1 >) )
    {};
     
    template< typename T1, typename T2 >
    MACRO( my_derived2, 2,(my_base2< T1, T2 >) )
    {};
     
    template< typename T1, typename T2 ,typename T3>
    MACRO( my_derived3, 3,(my_base3< T1, T2, T3 >) )
    {};
     
    int main()
    {
            my_derived1<int> m1;
            my_derived2<int,int> m2;
            my_derived3<int,int,int> m3;
     
        return 0;
    }

    Citation Envoyé par screetch Voir le message
    mais ca pique les yeux
    C'est souvent le cas avec Boost.Preprocessor

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Le BOOST_PP_TUPLE_REM n'est pas trop possible parce que ça m'oblige à modifier la manière d'utiliser la macro.
    Par contre BOOST_PP_COMMA est une solution de contournement possible, même si oui bien sûr idéalement j'aurais préféré quelque chose de plus lisible.

    Merci à vous !

    MAT.

Discussions similaires

  1. [XL-2007] remplacement de point en virgule automatiquement dans une macro
    Par skipeemed dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 01/10/2010, 12h34
  2. Code asm dans une macro C
    Par progfou dans le forum C
    Réponses: 11
    Dernier message: 01/03/2006, 18h50
  3. Comment insérer une macro excel dans une macro word?
    Par max2245 dans le forum VBA Word
    Réponses: 15
    Dernier message: 07/01/2006, 17h44
  4. interdire virgule, .. dans une zone de texte
    Par EE dans le forum Access
    Réponses: 4
    Dernier message: 05/01/2006, 09h11
  5. pb dans une macro excel VB
    Par syl221 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/10/2005, 17h29

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