Pointer auf C++ Memberfunktion an C Funktion übergeben
-
Hallo,
ich habe hier eine C-Funktion die einen Pointer auf eine C-Funktion als Eingabe erwartet.
Dieser Funktion möchte ich einen Pointer auf eine Memberfunktion einer C++ Klasse übergeben. Diese Memberfunktion soll nicht statisch sein.// C Funktion void execPointer(int (*fp)(void *)); // Meine Klasse class Foo { int bar(void *) { // Tu was ... return 0; } }; // int main() { Foo foo; execPointer(&foo.bar); }
Leider funktioniert das so nicht.
Fehler: ISO-C++ verbietet das Ermitteln der Adresse einer gebundenen Elementfunktion, um einen Zeiger auf Elementfunktion zu erzeugen. Stattdessen »&Foo::bar« verwenden
Benutze ich das vorgeschlagene
execPointer(&Foo::bar);
bekomme ich das:
Fehler: »int (Foo::)(void)« kann nicht nach »int ()(void)« für Argument »1« nach »int execPointer(int ()(void))« umgewandelt werden
Jemand eine Idee?
-
Ich glaub des geht garnich.
-
Eine C++ Methode hat die Calling-Convention thiscall. Dh. um sie aufrufen zu können benötigt man immer auch die Adresse eines zugehörigen Objekts. Schau dir mal Boost: bind an.
Greetz, Swordfish
-
Wenn 'execPointer' wirklich nur den Pointer auf einen Funktion übergeben bekommt, und nicht zusätzlich den "Parameter Pointer", dann wird es kompliziert, dann brauchst du einen Thunk. Was sehr sehr Plattformabhängig und auch relativ heikel zu machen ist. Du kannst dir mal die ATL ansehen, da werden z.B. solche Thunks für die WndProc verwendet.
Ich würde aber eher empfehlen dass du schaust ob du es nicht irgendwie anders lösen kannst.
-
Hi,
wie wäre es, wenn Du Deine Memberfunktion in eine andere kaspelst ?
// C Funktion void execPointer(int (*fp)(void *)); // Meine Klasse class Foo { static Foo* actual; int bar(void *) { // Tu was ... return 0; } }; int myCallback(void* p) { return Foo::actual->bar(p); } // int main() { Foo foo; Foo::actual = &foo; execPointer(&myCallback); }
Mit der static-Variable musst Du natürlich bzgl. Threadsafety u.a. vorsichtig sein, aber prinzipiell kann man durchaus einen Mechanismus finden, einer Funktion einen Parameter außerhalb der Parameterliste zu übergeben.
Gruß,
Simon2.