将指向成员函数的指针转换为普通指针

Atm*_*ons 4 c++ pointers casting

目前我有一类此类,简化为了简化:

class MyClass {
    public: 
        MyClass();
        void* someFunc(void* param);
}
Run Code Online (Sandbox Code Playgroud)

现在我需要调用这种类型的函数(不是任何类的成员,我很遗憾无法更改)但是我还需要调用它:

void secondFunc(int a, int b, void *(*pCallback)(void*));
Run Code Online (Sandbox Code Playgroud)

现在我需要传递一个实例的someFunc的地址.

一个不起作用的样本:

MyClass demoInstance;
// some other calls
secondFunc( 1, 2, demoInstance::someFunc() );
Run Code Online (Sandbox Code Playgroud)

我也试过像以下演员:

(void* (*)(void*)) demoInstance::someFunc;
reinterpret_cast<(void* (*)(void*))>(demoInstance::someFunc);
Run Code Online (Sandbox Code Playgroud)

如何使用类的成员函数作为参数调用此函数,以便可以将其用作回调?

任何想法或评论都表示赞赏.谢谢并尊重托比亚斯

Jon*_*pan 8

您无法直接调用成员函数.成员函数指针与函数指针的类型不同.

你需要以某种方式将它包装在兼容的函数中.但是,如果您的外部函数(将函数指针作为参数的函数)不可重入并且不提供额外的参数供函数指针使用,则您将无法传递成员所使用的实例功能运行,所以你实际上无法拨打电话.


rus*_*lik 5

C函数和C++成员函数之间的区别在于C函数使用cdecl调用约定,而成员函数使用thiscall调用约定(你甚至不能使用它们的地址!).

据我所知,你实际上想要secondFunc()调用类的特定实例的成员函数(让我们调用它this).那么,特定类的所有实例的成员函数的地址是相同的.为了将指针传递给对象,您需要一个侧面通道.在这种情况下,它可以是静态变量.或者,如果您需要MT支持,则必须使用线程本地存储(TLS),

这需要一个回调每个SomeFunc类型的成员,但无论如何你需要一个调度员.