C ++ 11:使用std :: function :: target()指向成员函数的指针

时间:2013-05-13 12:05:59

标签: c++ c++11 function-pointers member-function-pointers

我知道这已经是一个长期讨论的主题,但我还没有找到满足我的答案。

简而言之:即使使用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();
}

1 个答案:

答案 0 :(得分:3)

您的成员函数不是void (*)(int, int)类型,而是void (A::*)(int, int)类型。因此,target会返回nullptr,因为您尝试转换为错误的类型。我建议您只使CBType成为std::function<void(int, int)>