これは少し複雑な問題なので、何が起こっているのかを説明するために最善を尽くします。何かが足りない場合は、明確にするために教えてください。
片側にモジュールまたはアプリケーションが「サービス」を提供し、クライアントがこのサービスでアクションを実行できるコールバックシステムがあります(基本的には非常に基本的な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はDiskを継承しますが、コールバックハンドラーはその型を受け取ることができないことです(コールバック関数ポインターはジェネリックでなければならないため)。
RTTIとテンプレートはここで役立ちますか?
任意の提案をいただければ幸いです。