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声明为静态然后它可以工作,但我不希望它是静态的.有没有办法将它传递给非静态回调函数?
谢谢
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)
this您可以将其保持静态,但除了您想要的任何其他用户数据之外,还使用用户数据来存储指针(例如,通过将它们打包到结构中),然后通过调用this->someCallback(其中this是)从静态版本中调用特定于对象的回调当然,存储在用户数据中的指针)。
| 归档时间: |
|
| 查看次数: |
7703 次 |
| 最近记录: |