Lassen Sie uns sagen, dass ich eine Familie von Klassen haben, die alle die gleiche Schnittstelle implementieren, vielleicht für die Planung:Entwurfsmuster für das Caching von verschiedenen abgeleiteten Typen ohne RTTI mit
class Foo : public IScheduler {
public:
Foo (Descriptor d) : IScheduler (d) {}
/* methods */
};
class Bar : public IScheduler {
public:
Bar (Descriptor d) : IScheduler (d) {}
/* methods */
};
Lassen Sie uns jetzt sagen, dass ich einen Scheduler-Klasse haben, die Sie kann fragen, ob eine IScheduler-abgeleitete Klasse für einen gegebenen Deskriptor gestartet werden soll. Wenn es bereits existiert, erhalten Sie einen Hinweis darauf. Wenn einer nicht existiert, erzeugt er einen neuen.
Foo & foo = scheduler->findOrCreate<Foo>(descriptor);
dass Implementierung würde eine Karte, deren Schlüssel erforderlich waren (Beschreiber, RTTI) zugeordnet Basisklasse Zeiger:
Eine hypothetische Aufruf wäre so etwas wie sein. Dann müssten Sie dynamic_cast
. Etwas in dieser Richtung, ich denke:
template<class ItemType>
ItemType & Scheduler::findOrCreate(Descriptor d)
{
auto it = _map.find(SchedulerKey (d, typeid(ItemType)));
if (it == _map.end()) {
ItemType * newItem = new ItemType (d);
_map[SchedulerKey (d, typeid(ItemType))] = newItem;
return *newItem;
}
ItemType * existingItem = dynamic_cast<ItemType>(it->second);
assert(existingItem != nullptr);
return *existingItem;
}
fragen sich, ob jemand eine Möglichkeit hat, ein ähnliches Ergebnis ohne stützte sich auf RTTI wie dies zu erreichen. Vielleicht könnte jeder geplante Elementtyp eine eigene Karteninstanz haben? Ein Designmuster oder ...?
Keine allgemeine Musteränderung, aber eine interessante Vermeidung von RTTI. Denkst du, dass es in einem modernen C++ 11-Compiler einen großen Vorteil hat, so zu arbeiten? – HostileFork
@HostileFork: Ich denke nicht, dass es viel bringt im Vergleich zur Verwendung von 'typeinfo' ... es sei denn, Sie wollen ohne RTTI-Unterstützung kompilieren :) –
Das wird aufhören zu arbeiten, wenn man z. Windows DLLs. Ich weiß, dass der C++ - Standard immer noch garantiert, dass die Adresse eindeutig ist, aber ich kenne keinen Compiler, der dieses Verhalten tatsächlich mit Windows DLLs implementiert. Die Verwendung von typeid funktioniert jedoch immer noch. –