这是一个涉及到的问题,所以我会尽我所能解释发生了什么。如果我错过了什么,请告诉我,这样我可以澄清。将派生类实例作为void *传递给C++中的泛型回调
我们有一个回调系统,一方面模块或应用程序提供“服务”,客户端可以使用此服务执行操作(基本上是非常基本的IPC)。对于未来的参考,让我们说我们有一些定义,像这样:
typedef int (*callback)(void*); // This is NOT in our code, but makes explaining easier.
installCallback(string serviceName, callback cb); // Really handled by a proper management system
sendMessage(string serviceName, void* arg); // arg = value to pass to callback
这对于基本类型,比如结构或建宏工作正常。
我们有一个MI结构有点像这样:
Device <- Disk <- MyDiskProvider
class Disk : public virtual Device
class MyDiskProvider : public Disk
提供者可能是从硬件驱动程序什么一点胶水,处理磁盘映像。关键是类继承了磁盘。
我们有一个“服务”,这是通知系统中的所有新的磁盘,这是哪里的东西解开:
void diskHandler(void *p)
{
Disk *pDisk = reinterpret_cast<Disk*>(p); // Uh oh!
// Remainder is not important
}
SomeDiskProvider::initialise()
{
// Probe hardware, whatever...
// Tell the disk system we're here!
sendMessage("disk-handler", reinterpret_cast<void*>(this)); // Uh oh!
}
的问题是,SomeDiskProvider继承磁盘,但回调处理程序不会收到该类型(因为回调函数指针必须是通用的)。
RTTI和模板可以在这里帮助吗?
任何建议将不胜感激。
为什么不更像'typedef int(* callback)(Device *);'? – Earlz 2010-04-21 04:59:06
回调函数还需要接受没有Device作为基类的对象 - 例如结构体或内建类型(int,float等)。 – 2010-04-21 05:00:57
@Matt所以我认为做一个'CallbackMessage'类来包装这些东西是不实际的? – Earlz 2010-04-21 05:02:30