Klasse member-Funktion als callback mit boost::bind und boost::function
Ich bin arbeiten durch die Einrichtung einer member-Funktion als callback für eine C-library, die ich verwende. Die C-Bibliothek stellt Rückrufe wie diese:
typedef int (*functionPointer_t)(myType1_t*, myType2_t*, myType3_t*);
setCallback(param1, param2, functionPointer, param4)
Möchte ich die Verwendung von boost::bind (wenn möglich) zu übergeben, in der Funktion Zeiger. Ich würde es vorziehen, dass die Funktion hinwies, war ein Mitglied des instanziierten Klasse, nicht ein statisches Element. E. g.
Class A {
public:
A();
protected:
int myCallback(myType1_t*, myType2_t*, myType3_t*); //aka functionPointer_t
}
Kann das getan werden, mit boost::bind und boost::function? Pro Wie kann ich das übergeben einer Klasse member-Funktion als callback? (die 3. Antwort) es scheint, dass ich könnte, deklarieren Sie die folgenden (irgendwo, oder eine Typdefinition):
boost::function<int (A*, myType1_t*, myType2_t*, myType3*> myCallbackFunction
Und dann irgendwo in Ein (das Tor) - Aufruf von boost::bind an, die geben, und pass es in der C-library-Aufruf zu.
Ist das möglich, oder bin ich aus der base? Vielen Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Functor-Typen wie
boost::function
nicht konvertieren Funktion Zeiger für die Verwendung mit C-callback-Mechanismen.Aber die meisten C-callback-Mechanismen haben eine Art von token-Mechanismus, so dass Sie Ihre callback-Funktion (die statisch ist) hat eine Art von Kontext-Informationen. Sie können diese verwenden, um schreiben Sie eine wrapper-Klasse, welche Karten diese Token zu functor-Objekte und übergibt die Ausführung an die richtige:
param1, param2, param4
imsetCallback
zu schleichen in ein token wird an Sie zurückgeschickt-überint (*functionPointer_t)(myType1_t*, myType2_t*, myType3_t*)
?verwenden Sie keine Karte, es gibt die Laufzeit-overhead und Krempel-code mit statischen Karte.
verwenden
reinterpret_cast
statt.beispielsweise
Das problem mit den Funktionen ist, dass Sie automatisch erhalten einen Zeiger auf Objekt-Instanz als ersten parameter - Zeiger "this". Das ist, warum Sie nicht verwenden können member-Funktionen ein C callback-Funktionen. Sie müssen das Objekt UND die Funktion Zeiger zusammen, um eine member-Funktion.
A a; a.call();
entspricht dies:A a; A::call(&a);
wie pro die C++ - Spezifikation, glaube ich. Das problem ist, dass eine raw-Funktion Zeiger kann nicht mitbringen, diethis
Zeiger mit es.