Enviar el puntero a la función de miembro al puntero normal

Actualmente tengo una clase de este tipo, abreviada por simplicidad:

class MyClass { public: MyClass(); void* someFunc(void* param); } 

Ahora necesito llamar a una función de este tipo (no miembro de ninguna clase y que desafortunadamente no puedo cambiar ) pero a la que debo llamar de todos modos:

 void secondFunc(int a, int b, void *(*pCallback)(void*)); 

Ahora necesito pasar la dirección de algúnFunc de una instancia.

Una muestra que no funciona:

 MyClass demoInstance; // some other calls secondFunc( 1, 2, demoInstance::someFunc() ); 

Lo he intentado también con moldes como:

 (void* (*)(void*)) demoInstance::someFunc; reinterpret_cast(demoInstance::someFunc); 

¿Cómo puedo llamar a esta función con una función de miembro de clase como parámetro para que ésta pueda usarla como callback?

Cualquier idea o comentario es apreciada. Gracias y saludos tobias

La diferencia entre una función C y una función miembro C ++ es que la función C usa la convención de llamada cdecl , mientras que las funciones miembro utilizan esta convención de llamadas (¡y ni siquiera puede tomar su dirección!).

Según tengo entendido, en realidad quiere que secondFunc() llame a la función miembro de una instancia particular de la clase (llamémoslo así). Bueno, las direcciones de las funciones miembro de todas las instancias de una clase particular son las mismas. Para pasar el puntero al objeto, necesitarás un canal lateral. En este caso, podría ser una variable estática. O bien, si desea soporte de MT, tendrá que usar Thread Local Storage (TLS),

Esto requiere una callback por miembro de tipo SomeFunc , pero de todos modos necesitaría un despachador.

No puede llamar a la función miembro directamente. Los punteros de función de miembro no son del mismo tipo que los punteros de función.

Tendrá que envolverlo en una función compatible de alguna manera. Sin embargo, si su función externa (la que toma el puntero a la función como argumento) no es reentrante y no proporciona un argumento adicional para el uso del puntero a la función, no podrá pasar la instancia en la que el miembro funciona, por lo que no podrá realizar la llamada.

Hay una ronda sobre la forma de hacerlo. Como los nombres de C ++ están destrozados, no se puede utilizar directamente para funciones no estáticas. Sin embargo, dado que las funciones no estáticas tienen las mismas firmas que las funciones de C, puede usarlas directamente como devoluciones de llamada. Por lo tanto, para funciones no estáticas, puede tener envoltorios de funciones estáticas. Esta página explica este enfoque en detalle.

 class MyClass { public: MyClass(); void* someFunc(void* param); }; void* callback(void*) { MyClass instance; instance.someFunc(0 /* or whatever */); } void foo() { secondFunc( 1, 2, callback); } 

Vea esta muestra:

 #include  class MyClass { public: MyClass() { } void* someFunc(void* param) { std::cout << "someFunc" << std::endl; return (void*)0; } }; typedef void* (MyClass::*MemFun)(void*); void secondFunc(int a, int b, MemFun fn) { MyClass* ptr = 0; // This is dangerous! If the function someFunc do not operate the data in the class. // You can do this. (ptr->*fn)(0); std::cout << "Call me successfully!" << std::endl; } int main() { secondFunc(1, 2, &MyClass::someFunc); system("pause"); return 0; } 

No vi la parte sobre no poder cambiar la segunda función antes.

Defina una estructura con punteros a la función miembro y al objeto:

 struct MyData { MyStruct *myInstance; (void *)(MyStruct::myFunction)(void *data); void * dataPointer ; } 

Crea una función que pueda invocar el método apropiado:

 void *proxyFunc( MyData *data) { return (data->myInstance->*(data->myFunction))(data->dataPointer); } 

Luego llama a la función 2 como:

 MyData dataP = { someInstance, &MyStruct::someFunc, &dataPtr }; secondFunc(proxyFunc, &dataP);