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 :

[Spirit] utilisation de phoenix::ref et de bind


Sujet :

Boost C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Par défaut [Spirit] utilisation de phoenix::ref et de bind
    Bonjour,

    Toujours dans le l'optique de faire un petit parseur, je me heurte à un problème qui me parait étrange.

    J'ai un parseur qui ne fait que de lire un int, et je voudrais mettre cet entier dans une variable après l'avoir fait passé dans une fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int add5(int i)
    {
    	return i+5;
    }
    j'ai un entier resultat et en voulant compiler ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rule<iter_t > form;
    		form = int_	[phx::ref(resultat) = boost::bind(add5,qi::_1)]
    j'ai une erreur de compilation qui remplis mon terminal.

    Pourtant en remplaçant l'action par l'une de ces actions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [_val = boost::bind(add5,qi::_1)];
    [_val = qi::_1];
    [phx::ref(resultat) = qi::_1];
    ça compile et ça marche.

    Ayant toujours vécu dans un monde ou l'opérateur = était transitif, j'ai du mal à comprendre pourquoi ça ne marche pas.

    Evidement l'objectif final c'est pas d'ajouter 5 à un entier, juste de "maitriser" le ref et bind.
    Ah et phx c'est boost::phoenix.

    Enfin voilà je serais très reconnaissant envers celui qui pourrait me sortir de mon incompréhension.

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form = int_	[phx::ref(resultat) = boost::bind(add5,qi::_1)]

    Pourquoi mixer autant ? T'utilises phoenix, utilise le partout. Tu mélanges des placeholders là.


    http://www.boost.org/doc/libs/1_42_0...c_actions.html :
    There are different ways to write semantic actions for Spirit.Qi: using plain functions, Boost.Bind, Boost.Lambda, or Phoenix. The latter three allow you to use special placeholders to control parameter placement (_1, _2, etc.). Each of those libraries has it's own implementation of the placeholders, all in different namespaces. You have to make sure not to mix placeholders with a library they don't belong to and not to use different libraries while writing a semantic action.

    ps : pour les prochaines fois essayent de donner un code minimum compilable. (c'est beaucoup plus simple pour nous tester derrière )

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Par défaut
    Citation Envoyé par Goten Voir le message
    Pourquoi mixer autant ? T'utilises phoenix, utilise le partout. Tu mélanges des placeholders là.
    C'est ma technique d'apprentissage :p

    J'ai jamais utilisé de type aussi compliqué que des placeholders du coup j'y vais un peu a tâtons.

    En tout cas en utilisant phoenix::bind ça fonctionne impec

    Je me retrouve avec une action comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [phx::ref(resultat) = phx::bind(ipp,qi::_1)];
    Pour ce qui est du code compilable, c'est noté, mais la je me doutais un peu que c'était encore une reponse du genre "tu n'utilise pas la bonne librairie".

    J'vais d'abord apprendre à lire quoi ... ^^

    Bref merci à toi pour ton aide !

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 21/08/2013, 21h39
  2. boost::spirit utilisation des arguments
    Par SKone dans le forum Boost
    Réponses: 11
    Dernier message: 28/01/2011, 11h16
  3. problème utilisation label et ref
    Par nicoo04 dans le forum Mise en forme
    Réponses: 2
    Dernier message: 20/10/2009, 15h32
  4. [JGoodies ] Utiliser un objet hérité pour le binding
    Par mush_H dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 18/09/2007, 09h02

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