web-dev-qa-db-fra.com

Comment utiliser boost bind avec une fonction membre

Le code suivant provoque le blocage de cl.exe (MS VS2005).
J'essaie d'utiliser boost bind pour créer une fonction permettant d'appeler une méthode de myclass:

#include "stdafx.h"
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <functional>

class myclass {
public:
    void fun1()       { printf("fun1()\n");      }
    void fun2(int i)  { printf("fun2(%d)\n", i); }

    void testit() {
        boost::function<void ()>    f1( boost::bind( &myclass::fun1, this ) );
        boost::function<void (int)> f2( boost::bind( &myclass::fun2, this ) ); //fails

        f1();
        f2(111);
    }
};

int main(int argc, char* argv[]) {
    myclass mc;
    mc.testit();
    return 0;
}

Qu'est-ce que je fais mal?

73
hamishmcn

Utilisez les éléments suivants à la place:

boost::function<void (int)> f2( boost::bind( &myclass::fun2, this, _1 ) );

Cela transmet le premier paramètre transmis à l'objet fonction à la fonction à l'aide de balises - vous devez indiquer Boost.Bind comment gérer les paramètres. Avec votre expression, il essaierait de l'interpréter comme une fonction membre ne prenant aucun argument.
Voir par exemple ici ou ici pour les modèles d'utilisation courants.

Notez que VC8s cl.exe plante régulièrement sur Boost.Bind - en cas de doute, utilisez un scénario de test avec gcc et vous obtiendrez probablement de bons conseils, comme les paramètres du modèle Bind - les internes ont été instanciés avec si vous avez lu la sortie.

100
Georg Fritzsche