Ich versuche, eine Anwendung zu schreiben, die ihre Erweiterungen während der Laufzeit dynamisch lädt. Ich habe die Boost Preprocessor-Bibliothek verwendet, um eine Präprozessor-Funktion zu schreiben, die bei einer Liste von Namen eine Klasse für jeden Namen deklariert (und alle Unterklassen einer AbstractPlugin-Klasse erzeugt) und dann eine Boost MPL-Sequenz deklariert, die diese Klassen enthält. Dann schrieb ich eine Klasse, die einen Zeiger auf AbstractPlugin ausprobiert, wenn sie auf einen der Typen in dieser MPL-Sequenz umgewandelt werden könnte. Das Problem hier ist, dass meine Präprozessor-Funktion eine vollständige Liste aller Erweiterungen benötigt, die ich erstellen und laden möchte. Gibt es eine Technik, mit der ich jede Erweiterung in einer separaten Datei registrieren kann?Registrieren Sie eine C++ - Klasse, damit später eine Funktion über alle registrierten Klassen iterieren kann
Update:
Ich glaube, meine Erklärung zur Situation zu vage war, so habe ich beschlossen, es präziser zu machen.
Ich möchte eine Sammlung von Erweiterungstypen definieren. Für jeden Erweiterungstyp kann eine beliebige Anzahl von Erweiterungen vorhanden sein. Während der Laufzeit lädt das Programm eine externe Bibliothek, löst die Eingangspunktfunktion auf, ruft sie auf und erhält als Ergebnis einen Zeiger. Dann wird versucht, diesen Zeiger auf alle registrierten Erweiterungstypen zu setzen (unter Verwendung von dynamic_cast
, so dass Klassen für Erweiterungstypen alle von einer bestimmten polymorphen Basisklasse erben). Wenn eine Umwandlung in einen Erweiterungstyp erfolgreich ist, wird der Casted Pointer in einem Aufruf des speziellen Handlers für diesen Erweiterungstyp verwendet.
Die Anzahl der Erweiterungstypen ist zur Kompilierungszeit bekannt (während die Anzahl der Erweiterungen natürlich unendlich ist). Mit meinem Ansatz prüft die Loader-Klasse anhand dieser Kenntnisse, ob für jeden Erweiterungstyp ein Handler existiert (falls nicht, kompiliert das Programm nicht). Außerdem erzwingt meine Vorgehensweise keine Klassen für Erweiterungstypen, die etwas über den Loader wissen (so ist es einfach, den Loader zu modifizieren). Aber es wäre bequemer, wenn jeder Erweiterungstyp sich selbst registriert.
Erzeugt eine Kopfzeile eine akzeptable Lösung? – Arpegius