Automatische Kompilierzeit-Factory-Registrierung von Klassenvorlagen in C ++

8

Ich suche nach einer abstrakten Factory für Klassenvorlagen, wo sich die Klassen automatisch zur statischen Initialisierungszeit registrieren. Für reguläre (nicht-templated) Klassen ist die Lösung einfach genug mit statischen Mitgliedern. Hier ist ein Beispiel für eine (ziemlich einfache) Lösung, die gut funktioniert:

%Vor%

Die Frage, die ich habe, ist, wie es funktioniert, wenn das Zeug, das ich registrieren / erstellen möchte, eher wie folgt aussieht:

%Vor%

Die beste Idee, die ich mir vorstellen kann, ist die Vorlage der Fabrik, etwas wie:

%Vor%

Aber ich frage mich, ob es einen besseren Weg gibt, oder ob jemand ein solches Muster zuvor implementiert hat.

BEARBEITEN: Wenn ich dieses Problem ein paar Jahre später (und mit variadischen Vorlagen) erneut betrachte, kann ich viel näher kommen, was ich will, indem ich Funktionen einfach als Template-Parameter für die Factory "registriere". Es würde ungefähr so ​​aussehen:

%Vor%

Nun, das ist nur ein simplifizierter Prototyp, also niemals create () 's lineare Komplexität. Der Hauptmangel dieses Designs ist jedoch, dass es keine Konstruktorparameter erlaubt. Idealerweise wäre ich in der Lage, nicht nur die Klassen zu registrieren, die die Factory erstellen muss, sondern auch die Typen, die jede Klasse in ihrem Konstruktor verwendet, und create () sie variabel zu erstellen. Hat jemand schon einmal so etwas gemacht?

    
Eitan 06.10.2011, 19:15
quelle

2 Antworten

3

Ich habe eine Antwort auf ein ähnliches Problem bei GameDev gepostet, aber die Lösung ist keine Kompilierzeit. Sie können es hier überprüfen:
& gt; Ссылка

Ich glaube nicht, dass es sogar eine Möglichkeit gibt, diese Kompilierzeit zu machen. Ihre "ID" innerhalb der Basisklasse ist eigentlich nur eine vereinfachte Form von RTTI, die per Definition Laufzeit ist. Vielleicht, wenn Sie die ID zu einem Template-Argument machen ... aber das würde einige andere Dinge viel komplizierter machen.

    
Paul Manta 06.10.2011 19:53
quelle
0

Einfachere Dinge zu tun wird weniger brechen und macht Ihre Absichten offensichtlich.

%Vor%

Wenn diese Init-Funktionen tatsächlich aufgerufen werden (nicht zur Kompilierzeit) und sie fehlschlagen, werden Sie nicht all die ziemlich einfachen Dinge bekommen, die das Debuggen einfacher machen. Wie ein Stack-Trace.

Bei diesem Szenario gehen Sie auch davon aus, dass Sie sie nicht anders initialisieren möchten. Es ist zu kompliziert, zum Beispiel "automatisch registriert" etwas zu testen.

Weniger Magie = leichtere, billigere Wartung.

Wenn das nicht genug ist, gibt es auch technische Probleme. Compiler streichen gerne unbenutzte Symbole aus Bibliotheken aus. Es mag einen Compiler spezifischen Shenanigan geben, um es zu umgehen, ich bin mir nicht sicher. Hoffentlich tut es es in einer konsistenten Weise, anstatt zufällig ohne ersichtlichen Grund in der Mitte eines Entwicklungszyklus.

    
Tom Kerr 06.10.2011 19:30
quelle