首页 > 其他分享 >成员函数指针做回调参数总结 踩坑

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

时间:2023-12-14 23:00:44浏览次数:26  
标签:void C++ cast 参数 static 函数指针 回调 pointer

成员函数指针做回调参数总结 踩坑
一、程序升级后,在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.

标签:void,C++,cast,参数,static,函数指针,回调,pointer
From: https://www.cnblogs.com/shuigsls/p/17902391.html

相关文章

  • gdb调试带参数的应用程序
    $gdb--args./AV1V2V3$gdb./A,进入gdb后 runV1V2V3$gdb./A,进入gdb后 设置参数setargsV1V2V3再直接run。 参考:https://blog.csdn.net/guoqianqian5812/article/details/51755852?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-b......
  • java写个爬虫抓取汽车之家车型配置参数
    前几天有个搞工程的表弟找我,问我什么车好,可以经常跑工地的,看上去又有面子。于是我挥动发财的小手,写一个爬虫程序,筛选并整理了一些数据,并附上下载的图片提供参考,看中了果断第二天提车到手。我是使用Java编写的爬虫程序,用于抓取汽车之家网站上的车型、车系、配置参数数据。以下是每行......
  • SpringBoot接收日期参数异常
    一、关于接收前端传递的日期参数的问题:前提:Date类型的属性上添加了以下注解:@JsonFormat(timezone="GMT+8",pattern="yyyy-MM-dd")@DateTimeFormat(pattern="yyyy-MM-dd")@JSONField(format="yyyy-MM-dd")1、java.sql.date:空字符串解析报错,正常日期格式字符串没问......
  • avue option 参数
    option:{labelWidth:20,//标签宽度gutter:132,//间距card:true,//是否列表公用tabs:true,//开启选项卡tabsActive:3,//选项卡个数emptyBtn:true,//是否显示清空按钮,默认truesubmitBtn:true,......
  • SQLServer数据库JDBC连接串参数的简单学习
    SQLServer数据库JDBC连接串参数的简单学习背景前段时间一直跟同事一起处理SQLServer比其他数据库的deadlock更多的问题.涉及到了几个驱动的参数.想着问题基本上告一段落,将这一块的情况总结一下.便于后续遇到问题时的快速处理.关于参数现阶段的字符连接串为:jdbc:s......
  • iframe父子页面通信相互调用传递参数多个postMessage
    效果如何运行父页面代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • Go函数参数传递到底是值传递还是引用传递?
    在函数中,如果参数是非引用类型(int、string、array、struct等),这样就在函数中就无法修改原内容数据;如果参数是引用类型(指针、map、slice、chan等),这样就可以修改原内容数据。是否可以修改原内容数据,和传值、传引用没有必然的关系。在C++中,传引用肯定是可以修改原内容数据的,在Go语言......
  • kotlin 泛型的类型擦除和实化类型参数
    JVM上的泛型一般是通过类型的擦除实现,就是泛型类实例的类型实参在运行时不保留。但是可以通过声明为inline函数使其类型实参不被擦除那么对类型擦除有啥好处呢?应用程序使用的内存总量较小,因为要保存在内存中的类型信息更少。一、类型检查和转换1、类型检查因为类型会被擦除,那......
  • MySQL中的slave_exec_mode 参数详解(MySQL从节点复制错误处理时,sql_slave_skip_counter
    原文地址:https://www.soughttech.com/front/article/7159/viewArticle  今天我偶然看到了参数slave_exec_mode。从手册中的描述可以看出,该参数与MySQL复制有关。它是一个可以动态修改的变量。默认为STRICT mode(严格模式),可选值为IDEMPOTENT mode(幂等模式)。设置为IDEMP......
  • get请求数组参数,格式转换
    get请求转码关于qs插件qs是一个增加了一些安全性的查询字符串解析和序列化字符串的库。可以进行对象与字符串之间的一个转换。安装qsaxios中自带qs无需下载,若单独下载只需npminstallqs即可使用组件中单独引入importqsfrom'qs'或者全局引入(main.js)Vue.prototyp......