Это немного сложная проблема, поэтому я сделаю все возможное, чтобы объяснить, что происходит. Если я что-то упустил, пожалуйста, скажите мне, чтобы я мог уточнить.
У нас есть система обратного вызова, в которой модуль или приложение с одной стороны предоставляет «Сервис», и клиенты могут выполнять действия с этим Сервисом (в основном очень элементарный 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 и шаблоны?
Любые предложения будут с благодарностью.