如何将非静态成员函数作为回调传递?

inf*_*oop 7 c++ function callback member non-static

 
io_iterator_t enumerator;
kern_return_t   result;
result = IOServiceAddMatchingNotification(
             mNotifyPort,
             kIOMatchedNotification,
             IOServiceMatching( "IOFireWireLocalNode" ),
             serviceMatchingCallback, 
             (void *)0x1234,
             & enumerator );

serviceMatchingCallback((void *)0x1234, enumerator);

如果我将serviceMatchinCallback声明为静态然后它可以工作,但我不希望它是静态的.有没有办法将它传递给非静态回调函数?

谢谢

R S*_*hko 7

IOServiceMatchingCallback的原型与非静态类方法不兼容(技术上也与静态类方法不兼容),因此您无法使用它.

但幸运的是,IOServiceAddMatchingNotification支持上下文指针(或者他们称之为refCon),它允许您创建不依赖于全局数据的thunk.

您需要定义具有兼容链接的回调(即extern"C").此函数会将refCon强制转换为对象指针,然后将调用转发给您的实例方法:

extern "C"
void io_callback(void *refcon, io_iterator_t iterator)
{
    myclass *c = static_cast<myclass *>(refcon);
    c->real_callback(iterator);
}
Run Code Online (Sandbox Code Playgroud)

然后,当你调用IOServiceAddMatchingNotification时,确保将指针传递给你的refCon对象(这里我假设你从一个成员函数调用IOServiceAddMatchingNotification,你有一个这个指针):

result = IOServiceAddMatchingNotification(
             mNotifyPort,
             kIOMatchedNotification,
             IOServiceMatching( "IOFireWireLocalNode" ),
             serviceMatchingCallback, 
             this,
             &enumerator );
Run Code Online (Sandbox Code Playgroud)


Syd*_*ius 4

this您可以将其保持静态,但除了您想要的任何其他用户数据之外,还使用用户数据来存储指针(例如,通过将它们打包到结构中),然后通过调用this->someCallback(其中this是)从静态版本中调用特定于对象的回调当然,存储在用户数据中的指针)。