Verwendung der Boost-Bindung mit einer Member-Funktion

77

Der folgende Code führt zum Absturz von cl.exe (MS VS2005).
Ich versuche, Boost Bind zu verwenden, um 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?

hamishmcn
quelle

Antworten:

106

Verwenden Sie stattdessen Folgendes:

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

Dadurch wird der erste an das Funktionsobjekt übergebene Parameter mithilfe von Platzhaltern an die Funktion weitergeleitet. Sie müssen Boost.Bind mitteilen, wie mit den Parametern umgegangen werden soll. Mit Ihrem Ausdruck würde er versuchen, ihn als Mitgliedsfunktion zu interpretieren, ohne Argumente.
Siehe zB hier oder hier für allgemeine Verwendungsmuster.

Beachten Sie, dass VC8s cl.exe bei Boost.Bind-Missbrauch regelmäßig abstürzt. Wenn Sie Zweifel haben, verwenden Sie einen Testfall mit gcc, und Sie erhalten wahrscheinlich gute Hinweise wie die Vorlagenparameter, mit denen Bind- Interna instanziiert wurden, wenn Sie die Ausgabe lesen.

Georg Fritzsche
quelle
Gibt es eine Chance, dass Sie mit diesem stackoverflow.com/questions/13074756/… helfen können ? es ist ähnlich, std::functiongibt aber einen Fehler
kirill_igum
Danke, das ist etwas verwirrend, aber deine Antwort hat meinen Speck gerettet!
Portforwardpodcast