C++函数回调:无法从成员函数转换为函数签名

Jon*_*oss 5 c++ boost bind function signature

我正在使用第三方库,允许我为某些事件注册回调.寄存器功能看起来像这样.它使用Callback签名.

typedef int (*Callback)(std::string);

void registerCallback(Callback pCallback) {
//it gets registered
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我想将一个成员函数注册为这样的回调

struct MyStruct {
    MyStruct();
    int myCallback(std::string str);
};

MyStruct::MyStruct() {
    registerCallback(&MyStruct::myCallback);
}

int MyStruct::myCallback(std::string str) {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,编译器抱怨说

错误C2664:'registerCallback':无法将参数1从'int(__thiscall MyStruct ::*)(std :: string)'转换为'Callback'

我一直在寻找像函数和绑定这样的boost库,但是这些都没有能够做到这一点.我一直在谷歌寻找答案,但我甚至不知道该怎么称呼它,所以它没有多大帮助.

提前致谢.

Set*_*gie 7

您正在尝试将成员函数指针作为普通函数指针传递,这将无法正常工作.成员函数必须将this指针作为隐藏参数之一,而普通函数则不然,因此它们的类型不兼容.

您可以:

  1. 更改参数的类型以接受成员函数,并接受实例作为调用对象
  2. 退出尝试传递成员函数并传递正常函数(可能通过制作函数static)
  3. 有一个普通的函数,它接受你的类的一个实例,一个成员函数指针,和一个std::string像boost一样的东西bind来绑定前两个参数
  4. 使回调注册函数接受一个仿函数对象,或者std::function(我认为这是名称)
  5. 许多其他方式我不会在这里详述,但你得到了漂移.