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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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 : 38
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    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

  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
    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 confirmé 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 : 38
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    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

  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
    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 confirmé 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 : 38
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    La réponse est assez simple : j'avais juste oublié le const =s

  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
    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 ?

+ 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