成员函数指针做回调参数总结 踩坑

成员函数指针做回调参数总结 踩坑

一、程序升级后,在linux上编译提示错误:

warning: converting from ‘int (MyClass::*)()’ to ‘void (*)()’ [-Wpmf-conversions]

  void(*myStoredFunction)(void) = (GENERIC_FUNC_TYPE)memberFunc; // Compiler warning

二、出现这个情况是因为,程序的这个模块是早期开发的,使用的是gcc4开发的,现在升级到gcc7,c++版本兼容性问题,具体解决方法如下:

   1:用内联汇编方式,跳过c++,语法检测,x86_64汇编代码如下:

        __asm__ (

                 "mov %1, %0"

                 :"=r"(addr)

                 :"r"(&TEST::foo)

);

或者这样更好:

__asm__ ( ""                // no instructions

          :"=r"(addr)

          :"0"(&TEST::foo)  // same register as operand 0

);

   2:c++语法转换方式,代码如下:

template <typename C, void (C::*M)()>

void* AsFunc(void* p)

{

    (static_cast<C*>(p)->*M)();

}

    调用:void (*myExtractedFunction)(void*) = &AsFunc<MyClass, &MyClass::myMemberFunc>;

    

   或者:
template<typename dst_type,typename src_type>

dst_type pointer_cast(src_type src)

{

  return *static_cast<dst_type*>(static_cast<void*>(&src));

}

三、区别总结

     

参考相关文献

成员函数指针

C++函数指针、函数对象与C++11 function对象对比分析

    C++ 强制类型转换操作符static_cast

C++ 动态联编实现原理分析

C++类成员函数调用分析

    Pointers to Member Functions 

a pointer to member function to be invoked by the target class without functional

    Declares a variable of a pointer or pointer-to-member type.

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值