wake-up-neo.com

So verwenden Sie die Boost-Bindung mit einer Member-Funktion

Der folgende Code führt zum Absturz von cl.exe (MS VS2005).
Ich versuche, mit boost bind eine Funktion für einen Aufruf einer Methode von myclass zu erstellen:

#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;
}

Was mache ich falsch?

73
hamishmcn

Verwenden Sie stattdessen Folgendes:

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

Dies leitet den ersten an das Funktionsobjekt übergebenen Parameter mit Platzhaltern an die Funktion weiter - Sie müssen Boost.Bind mitteilen, wie mit den Parametern umgegangen werden soll. Mit Ihrem Ausdruck würde es versuchen, ihn als Elementfunktion zu interpretieren, die keine Argumente verwendet.
Siehe z. hier oder hier für allgemeine Verwendungsmuster.

Beachten Sie, dass VC8s cl.exe regelmäßig bei Boost.Bind Missbräuchen abstürzt - verwenden Sie im Zweifelsfall einen Testfall mit gcc und Sie erhalten wahrscheinlich gute Hinweise wie Die Template-Parameter Bind - Interna wurden instanziiert, wenn Sie die Ausgabe durchgelesen haben.

100
Georg Fritzsche