加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:40:23 所属栏目:百科 来源:网络整理
导读:目前我有一类此类,简化为了简化: class MyClass { public: MyClass(); void* someFunc(void* param);} 现在我需要调用这种类型的函数(不是任何类的成员,我遗憾地无法更改)但是我还需要调用它: void secondFunc(int a,int b,void *(*pCallback)(void*)); 现
目前我有一类此类,简化为了简化:

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

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

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

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

一个不起作用的样本:

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

我也试过像以下演员:

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

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

任何想法或评论都表示赞赏.感谢致敬
托比亚斯

解决方法

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

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

这需要每个SomeFunc类型成员进行一次回调,但无论如何你都需要一个调度程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读