C 11:使用std :: function :: target()指向成员函数的指针
发布时间:2020-12-16 05:04:43 所属栏目:百科 来源:网络整理
导读:我知道这已经是一个长期讨论的话题,但我还没有找到满足我的答案. 简而言之:即使使用C 11的function :: target()功能,是不是可以将成员函数指针传递给c风格的方法? 以下代码不起作用:对mbf.target()的调用将返回0,从而生成SEGFAULT.我不明白为什么,因为我
我知道这已经是一个长期讨论的话题,但我还没有找到满足我的答案.
简而言之:即使使用C 11的function :: target()功能,是不是可以将成员函数指针传递给c风格的方法? 以下代码不起作用:对mbf.target()的调用将返回0,从而生成SEGFAULT.我不明白为什么,因为我将成员函数绑定到泛型函数对象,所以类型应该没问题. 我做错了什么或者我想做一些不可能的事情? #include <functional> using namespace std; typedef void (*CBType)(int,int); CBType myCB = 0; void regCallback(CBType cb) { myCB = cb; } class A { public: void memberCB(int a,int b) {} void registerCallback() { auto mbMem = mem_fn(&A::memberCB); function<void(int,int)> mbf = bind(mbMem,*this,placeholders::_1,placeholders::_2); regCallback(*mbf.target<void(*)(int,int)>()); } }; int main() { A inst; inst.registerCallback(); } 解决方法
您的成员函数的类型不是void(*)(int,int),它的类型为void(A :: *)(int,int).因此,当您尝试强制转换为错误类型时,target会返回nullptr.我建议只使CBType为std :: function< void(int,int)>.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ios – 找不到接受Swift中提供的参数的“init”的重载
- swift可以直接修改控件的frame
- c# – .NET Standard 1.6中的System.Threading.Tasks.Paral
- XML节点
- Swift 3(SpriteKit):停止永久循环的SKAction有一个延迟
- c# – 如何获取stringbuilder并将其转换为streamReader?
- ios – XCode 7 UITest导出日志
- c# – 为什么.NET 4.0 Client Profile中没有System.Data.Or
- Swift 结构体简单学习
- 当通过Lion上的Ajax运行时,PHP脚本会回显自己的内容