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?

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.