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 :

Faire comme boost::variant


Sujet :

C++

  1. #1
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut Faire comme boost::variant
    Voici ce que je d�fini
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <typename A1>
    struct mastruct
    {
    	A1 f1;
    };
     
    template <typename A1,typename A2>
    struct mastruct
    {
    	A1 f1;
    	A2 f2;
    };
    Le compilo n'accepte pas. Pourtant les boost::variant sont parfaitement accept�s.
    Comprend pas...

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Variant ne fait pas �a... Ils jouent � grand coup de macro pour les param�tres templates mais y'a qu'une seule classe ,)

  3. #3
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template <
          typename T0_
        , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)
        >
    class variant
    cf : http://svn.boost.org/svn/boost/trunk...nt/variant.hpp

    Faut scroller jusqu'au milieu environ pour tomber sur �a.

  4. #4
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    J'ai vu le code de boost avec son usage abusif de preproc... sans trop comprendre.
    Je pense cependant qu'il y a plusieurs d�finitions de variant. Il y en a une vingtaine, le fichier include s'incluant lui-m�me une vingtaine de fois avec � chaque fois un param en plus dans BOOST_VARIANT_ENUM_SHIFTED_PARAMS() (mettez plus de 20 param�tres template dans une instance de variant<> et �a p�te).
    Mais faisons simple.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    boost::variant<int,std::string> v1;
    boost::variant<long,short,char> v2;
    Le code qui pr�c�de est accept� par les compilos. J'aimerais juste imiter quelque chose de semblable. Vous voyez comment faire, m�me de mani�re minimaliste ? Une simple classe qui accepte 1 ou 2 param�tres template sera bien.

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Si tu est allergique � toute la machinerie de boost.prepocessor (parce que c'est �a qu'utilise variant derri�re) et que tu veux �tre portable alors tu peux utiliser les typelists.
    Pour l'allusion � la portabilit� je parle des variadics templates de la prochaine norme :p. (support� par gcc).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template<typename T, typename U>
    struct Typelist
    {
         typedef T head;
         typedef U tail;
    };
     
    struct NullType {};
     
    #define Typelist_1(arg1)  Typelist<arg1, NullType>
    #define Typelist_2(arg1, arg2) Typelist<arg1, Typelist_1(arg2)>
    ....
    Et si tu veux �viter du NIH alors tu peux regarder du c�t� de loki :p

    Remarque que si c'est juste pour deux arguments templates alors peut �tre tu pourrais envisager un truc comme �a ? :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    template <typename T1, typename T2 = NullType>
    struct foo { 
    //...
    };

  6. #6
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    Je ne souhaite pas faire mais comprendre.
    Tu as cependant un peu �clair� ma lanterne, boost fait quelque chose comme ceci avec les variants (il n'utilise pas d'include r�cursifs comme je le pensais, j'ai confondu avec l'include in_place_factory.hpp).
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct nulltype {};
     
    template <typename A1,typename A2=nulltype,typename A3=nulltype>
    struct mastruct
    {
     union {
    	A1 f1;
    	A2 f2;
    	A3 f3;
     };
    };
    boost::variant va jusque typename A20 si j'ai bien vu.

    La "machinerie" boost.preproc j'essaie aussi de la comprendre. Je n'arrive pas � faire l'�mulation d'un FOREACH.

    PS: qu'est-ce NIH ?

  7. #7
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Ouaip, �a va jusqu'� 20 types mais c'est extensible via la macro BOOST_VARIANT_LIMIT_TYPES.

    Ca fait un moment que j'ai pas regard� comment est g�r� la liste des templates pour �muler les variadics templates, la derni�re fois c'�tait sur boost.function. Pour boost.function il me semble que c'est vraiment que du pr�pocesseur, pas des typelist.




    NIH = not invented here.

  8. #8
    Membre chevronn�
    Inscrit en
    Ao�t 2004
    Messages
    556
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2004
    Messages : 556
    Par d�faut
    Si ton compilo le permet alors utilises les variadic templates et le template recursion plut�t que des macros.

  9. #9
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    Comprendre, avais-je dis que je souhaitais comprendre ?
    �a fait 15-20 que les macros C++ existent et je n'arrive pas � comprendre comment faire/simuler une b�te boucle. Malgr� qu'on dispose des exemples de boost sous les yeux, c'est une telle usine � gaz que j'arrive pas � comprendre comment c'est fait.

    Quant aux variadicmachins, encore faut-il les comprendre eux aussi
    Mais on verra �a apr�s la release et le premier service pack de VS2010 (l'exp�rience montre qu'il est prudent d'attendre avec MS ).

  10. #10
    Membre chevronn�
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par d�faut
    Voici une impl�mentation de boost::variant avec des templates variadiques. Je pense que c'est beaucoup plus lisible et compr�hensible :
    http://git.berlios.de/cgi-bin/gitweb...d5df3c43b8e61a

    Ensuite, Boost utilise le pr�processeur pour �muler les templates variadiques. Mais l'id�e de base est la m�me.
    Cours : Initiation � CMake
    Projet : Scalpel, biblioth�que d'analyse de code source C++ (d�veloppement en cours)
    Ce message a �t� tap� avec un clavier en disposition b�po.

  11. #11
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par camboui Voir le message
    Comprendre, avais-je dis que je souhaitais comprendre ?
    �a fait 15-20 que les macros C++ existent et je n'arrive pas � comprendre comment faire/simuler une b�te boucle. Malgr� qu'on dispose des exemples de boost sous les yeux, c'est une telle usine � gaz que j'arrive pas � comprendre comment c'est fait.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define REPEAT1(a, b) b(a)
    #define REPEAT2(a, b) b(a)REPEAT1(a,b)
    #define REPEAT3(a, b) b(a)REPEAT2(a,b)
     
    #define CAT_(a, b) a##b
    #define CAT(a,b) CAT_(a, b)
    #define REPEAT(n, a, b) CAT(REPEAT,n)(a,b)
     
    #define action(a) a+a+a
    REPEAT(2, x+y, action)

  12. #12
    screetch
    Invit�(e)
    Par d�faut
    est ce que tu peux expliquer le
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    #define CAT_(a, b) a##b
    #define CAT(a,b) CAT_(a, b)
    ?

  13. #13
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut
    Ah voil� qui est plus parlant !

    pluzun avec screetch, pourquoi ne pas faire directement #define CAT(a,b) a##b ?

  14. #14
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    C'est pour regler un probleme d'expansion de macro. C'est un grand classique. J'ai pas le temps de donner une explication, mais voir glue et xglue dans les exemples de la norme (que ce soit C ou C++, cet exemple y est) pour ceux qui en dispose.

  15. #15
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Voil� l'exemple de la norme pour ceux qui l'ont pas :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #define HIGHLOW "hello"
    #define LOW LOW ", world"
     
    #define GLUE(a, b)  a##b
    #define xGLUE(a, b) GLUE(a, b)
     
     
    GLUE(HIGH, LOW)
    xGLUE(HIGH, LOW)
    "L'appel" � GLUE va afficher "hello" car il concat�ne les deux chaines de caract�res HIGH et LOW ce qui donne HIGHLOW et le pr�pocesseur remplace �a en "hello"

  16. #16
    Membre �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par d�faut


    Cet exemple m'apprend deux choses:
    les fonctions sont �valu�es avant leurs param�tres;
    les param�tres ne sont �valu�s qu'une fois.

    EDIT: ceci ne passe pas:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    GLUE( x, GLUE(HIGH,LOW) )
    Ce n'est pas convertit en xGLUE(HIGH,LOW) ?

Discussions similaires

  1. Faire comme les methode de JOptionPane
    Par romuluslepunk dans le forum AWT/Swing
    R�ponses: 6
    Dernier message: 09/06/2006, 22h30
  2. Que faire comme �tude ?
    Par Xo Sonic oX dans le forum Etudes
    R�ponses: 7
    Dernier message: 03/06/2005, 15h51
  3. Que peux-t'on faire comme application ?
    Par lalystar dans le forum Java ME
    R�ponses: 2
    Dernier message: 11/12/2004, 05h36
  4. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    R�ponses: 5
    Dernier message: 06/11/2003, 15h39

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