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

Boost C++ Discussion :

[boost variant] passer un paramètre supplémentaire au visiteur


Sujet :

Boost C++

  1. #1
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut [boost variant] passer un paramètre supplémentaire au visiteur
    Bonjour à tous, comme indiquer dans l'intitulé, je souhaite passer dans mon visiteur (surcharge de l'operateur()) un paramètre supplémentaire qui ne soit pas de type visitable. Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class A
    {
    public:
         float a;
         A() :a(0) {}
    };
     
    class visiteur:public boost::static_visitor<>
    {
         template<typename T> void operateur()(T Variant, A &a)
         {
              ...
         }
    };
    Voilà je n'ai pas d'idée sur la façon de procéder pour réaliser ce genre de code (que ce soit avec ou sans boost d'ailleurs)...
    Merci d'avance, bonne journée
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  2. #2
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    C'est peut être pas la meilleure façon de faire, mais avec boost::bind on peut s'en sortir :
    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
    #include <iostream>
    #include <string>
    #include <boost/variant.hpp>
    #include <boost/bind.hpp>
    class A
    {};
     
    struct mon_visiteur :boost::static_visitor<void>
    {
       template<class T>
       void operator()(T &, A &)
       {
          std::cout<<"visiteur non const"<<std::endl;
       }
     
       template<class T>
       void operator()(T const &, A const &) const
       {
          std::cout<<"visiteur const"<<std::endl;
       }
     
    };
     
    // pour permettre une visite non const :
    template<class TFunctor, class TVariant>
    void visit(TFunctor functor_, TVariant &variant)
    {
       boost::apply_visitor(functor_,variant);
    }
     
    int main()
    {
       boost::variant<int,std::string> un_entier_ou_une_chaine;
       un_entier_ou_une_chaine=1;
     
       // pas trop compliqué pour un visiteur const :
       boost::apply_visitor(boost::bind(mon_visiteur(),_1,A()),un_entier_ou_une_chaine);
     
       // un peu plus compliqué pour un visiteur const :
       A a;
       visit(boost::bind(mon_visiteur(),_1,a),un_entier_ou_une_chaine);
     
       return 0;
    }

  3. #3
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Je ne sais pas pourquoi je m'étais mis en tête que boost bind ne marchera pas sur le visiteur en tout cas ça fonctionne correctement merci beaucoup.

    Note : Même si ce n'est pas mon cas l'astuce pour passer en non-const est plutôt bonne à connaitre encore merci
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  4. #4
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Note : Même si ce n'est pas mon cas l'astuce pour passer en non-const est plutôt bonne à connaitre encore merci
    Le visiteur que tu présentes en début du fil est non const. Donc je me suis demandé si ton problème était lié à ça ou non...

  5. #5
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    La réponse est assez simple : j'avais juste oublié le const =s
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Pourquoi tu passes pas l'argument directement au constructeur de ton visiteur, ce qui est la manière la plus logique et normale de faire ?
    Boost ftw

  7. #7
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par loufoque
    Pourquoi tu passes pas l'argument directement au constructeur de ton visiteur, ce qui est la manière la plus logique et normale de faire ?
    C'est ce que je faisais avant, bien sûr ça marche très bien mais niveau conception ça ne me plaisait pas (après c'est peut être moi qui suis un peu difficile ) sachant que le but de mon opérateur est supposé modifier A en fonction du paramètre variant passé. Et pour ceux qui se demanderai pourquoi j'ai dit que je passais en constant c'est juste qu'en réalité je passe un pointeur mais ma question originale se portais sur n'importe quel type passé en paramètre que ce soit en ref, const ref...(sur ce point j'aurais dû être plus précis...)
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    C'est ce que je faisais avant, bien sûr ça marche très bien mais niveau conception ça ne me plaisait pas (après c'est peut être moi qui suis un peu difficile )
    C'est pourtant comme ça qu'on fait pour capturer du contexte.
    Boost ftw

  9. #9
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Citation Envoyé par loufoque
    C'est pourtant comme ça qu'on fait pour capturer du contexte
    Ah oui en effet je n'ai pas non plus pensé à cette solution moi ce que je faisais avant, c'est une variable statique de mon visiteur que je mettais à jour chaque fois avant d'appeler mon visiteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class visiteur:public boost::static_visitor<>
    {
    public:
         template<typename T> void operateur()(T Variant)
         {
              ...
         }
     
         static A *MonObjetAModifier;
    };
    Cette solution n'est vraiment pas propre c'est pour ça que j'ai posté un message d'ailleurs mais en effet utiliser le constructeur aurait été bien plus logique...
    Par contre tu entends quoi par "capturer du contexte", je ne connais pas non plus?
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Bah les foncteurs, c'est la même chose que les closures...
    Sauf qu'avec les foncteurs, tu passes le contexte au constructeur, alors que la closure va automatiquement le capturer.
    Boost ftw

  11. #11
    Membre actif Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Points : 207
    Points
    207
    Par défaut
    Je connais les foncteurs mais ni les closures ni les contextes donc c'est un peu difficile de comprendre.... puisque ce n'est pas vraiment le sujet de mon post connaitrais-tu simplement quelques liens pratiques (anglais/français) qui traitent de ces notions, pour l'instant je n'ai pas trouvé grand chose...

    [edit] : j'ai trouvé en fait beaucoup plus de documents sur les closures, j'ai tout de même beaucoup de difficulté à comprendre car il y a beaucoup de notions que je n'ai pas assimilées en c++, je vais plutôt chercher des bouquins plus adaptés à mon niveau c++ pour mieux comprendre ces notions merci tout de même pour tes réponses (que j'espère comprendre un jour )
    - hp pavillon dv7
    - intel(R) Core(TM)2 Duo CPU P8400 @ 2.26GHz 2.27GHz
    - nVidia GeForce 9600M GT
    - mémoire vive : 3.0Go

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

Discussions similaires

  1. [Débutant] [fsolve] Passer des paramètres supplémentaires
    Par lecteur1001 dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/09/2010, 13h54
  2. passer des paramétres à un fichier sql
    Par vbcasimir dans le forum Oracle
    Réponses: 2
    Dernier message: 21/12/2004, 18h08
  3. Passer en paramètre d'une fonction (...)
    Par Captain_JS dans le forum C++
    Réponses: 5
    Dernier message: 03/11/2004, 07h18
  4. Passer en paramètre un chemin dans redirection
    Par croco83 dans le forum ASP
    Réponses: 5
    Dernier message: 07/05/2004, 08h30
  5. [struts] passer un paramètre de page via un findForward
    Par Boosters dans le forum Struts 1
    Réponses: 4
    Dernier message: 08/03/2004, 17h35

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