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

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)>.

(编辑:李大同)

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

    推荐文章
      热点阅读