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 :

Pointeur vers fonction membre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut Pointeur vers fonction membre
    Bonjour à tous,

    Aujourd'hui, je sèche sur un problème relativement simple avec boost::bind. Ca fait 1 heure que je sèche et ça m'énerve. La fatigue me direz-vous... Sans doute !

    Vois un exemple de code minimal qui reproduit mon problème : je cherche à appeler un callback membre avec une signature spécifique. La classe Agent provient d'une bibliothèque tierce qui appelle une fonction ayant un prototype précis (Agent::Func ici) pour passer les infos.
    Le seul truc que je peux toucher, c'est ma classe Test !
    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
     
    #include <iostream>
    #include <boost/bind.hpp>
     
    struct foo {};
    struct bar {};
     
    void free_callback(foo*, bar*)
    {}
     
    class Agent
    {
    public:
    	typedef void (*Func)( foo*, bar* );
     
    	virtual bool Initialize ( const char* name, Agent::Func p_func = NULL ) {}
    };
     
    class Test
    {
    public:
    	Test()
    	{
    		m_agent = new Agent;
    		m_agent->Initialize("mon_agent", free_callback); // OK
    		m_agent->Initialize("mon_agent", boost::bind(&Test::CallBack, this, _1, _2) ); // KO
    	}
    	~Test()
    	{
    		delete m_agent;
    	}
     
    private:
    	void CallBack(foo*, bar*);
     
    	Agent* m_agent;
    };
     
    int main()
    {
        return 0;
    }
    Compilo :
    error C2664: 'Agent::Initialize'*: impossible de convertir le paramètre 2 de 'boost::_bi::bind_t<R,F,L>' en 'Agent::Func'

  2. #2
    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
    Salut,

    Le type construit par l'appel à boost::bind n'est pas de type Agent::Func mais de type implementation-defined.
    Tu peux remplacer Agent::Func par un boost::function< void( foo*, bar* ) > pour que ça fonctionne.

    MAT.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Salut Mat !
    Arg, j'ai oublié de préciser. Je ne maitrise PAS la class Agent, elle vient d'une autre bibliothèque !

    EDIT: je crois avoir trouvé un début de solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Test()
    {
    	m_agent = new Agent;
    	m_agent->Initialize("mon_agent", free_callback); // OK
    	boost::function<void(foo*, bar*)> f = boost::bind(&Test::CallBack, this, _1, _2);
    	Agent::Func* f2 = f.target<Agent::Func>();
    	m_agent->Initialize("mon_agent", *f2 ); // OK
    }
    Maintenant je sais pas trop ce que ça vaut...

    RE EDIT : ça vaut rien du tout....

  4. #4
    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
    C'est quoi la vraie signature de la callback ? Y'a pas un void* prévu pour passer des données utilisateur ?

    MAT.

  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 poukill Voir le message
    je crois avoir trouvé un début de solution.
    Je ne pense pas que ça fonctionne, cf. http://lists.boost.org/Archives/boos.../12/145709.php par exemple.

    MAT.

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Je ne pense pas que ça fonctionne, cf. http://lists.boost.org/Archives/boos.../12/145709.php par exemple.

    MAT.
    Effectivement, ça ne marche pas du tout...
    http://stackoverflow.com/questions/2.../512233#512233 est un autre exemple....

    Du coup, je crois bien que je suis coincé...

    @MAT: la vraie signature de la callback est celle que j'ai montré. Sauf qu'évidement c'est pas foo et bar, mais ça ne change rien... J'attends un message d'une bibliothèque tierce vers une fonction avec une signature spécifique !

  7. #7
    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
    Et t'as pas moyen de convaincre les auteurs de Agent qu'il faut au moins un void* sinon c'est pas très utilisable (sauf si Test est un singleton bien sûr mais bon...) ?

    MAT.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 28/08/2008, 18h15
  2. Pointeur de fonction membre
    Par legend666 dans le forum C++
    Réponses: 1
    Dernier message: 04/10/2005, 20h46
  3. Pointeur vers fonction
    Par flopaname dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2005, 15h46
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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