Ich habe eine Klasse:Wrap C++ Methode mit einer C Methode
class C {
public:
int func1 (int arg1, int arg2) { return 1; }
float func2 (float arg1, float arg2) { return 2; }
} ;
Ich mag eine C Wrapper-Funktion für die Methoden und func1 func2 erstellen und dann in einen Leerfunktionszeiger gegossen.
typedef void (*Function)(void);
typedef Function *FunctionPtr;
FunctionPtr functions[] = {
(FunctionPtr)&Wrap<&C::func1>::f,
(FunctionPtr)&Wrap<&C::func2>::f
};
Nach dem ich konnte sie auf C Funktionszeiger zurückgeworfen und verwenden sie:
Class C c;
typedef int (*MyIntFunction)(C *c, int arg1, int arg2);
MyIntFunction *mif = (MyIntFunction *)functions[0];
int ri = (*mif)(&c, 1, 2);
typedef float (*MyFloatFunction)(C *c, float arg1, float arg2);
MyFloatFunction *mff = (MyFloatFunction *)functions[1];
float rf = (*mff)(&c, 1, 2);
ich mit verschiedenen Templat magics experimentiert haben, aber nicht der richtige Weg, so weit dies zu tun gefunden .
Wie erwarten Sie, eine Klasse in C zu deklarieren? –
Das Übergeben von Funktionszeigern an Datenzeiger ('void *') ist ein nicht definiertes Verhalten. – StoryTeller
Warum möchten Sie das tun?Besteigen Sie eine gemeinsam genutzte Bibliothek und möchten eine C-Schnittstelle zur zugrunde liegenden C++ - Implementierung? – Chad