2016-08-16 3 views
1

Ich brauche eine Vorlage-Klasse, die verschiedene Mitglieder hat, je nachdem welcher ctor aufgerufen wird. Ich habe es geschafft, eine Klasse zu bekommen, die verschiedene Mitglieder hat, die sfinae mit einer Basisklasse verwenden (ich habe es fast so gemacht SFINAE on member variable). Jetzt ist meine Frage, kann ich eine einzelne Template-Klasse erreichen, die verschiedene Mitglieder hat, je nachdem welcher ctor der Klasse aufgerufen wird? Vielleicht kann jemand eine Idee haben, wie man das erreicht.Ändern Anzahl der Mitglieder abhängig von Konstruktor namens

EDIT: Ich verwende derzeit boost::variant, aber das Problem ist, dass das größte Objekt in der Variante ist riesig, und die kleinste ist ein Zeiger. Dies ist ein echtes Leistungsproblem, da der Zeiger meistens in der Variante ist.

EDIT II: Wenn das mit einem ctor funktionieren würde, wäre es großartig, aber wenn nicht, würde auch eine Fabrik-Funktion funktionieren.

EDIT III (oder was ich versuche zu erreichen): Ich mache derzeit eine DSL, die in C++ übersetzt. Da ich versuche, Polymorphie möglich zu machen, gebe ich nur Zeiger auf Funktionen. Da einige Zeiger als Referenz gezählt werden und einige Zeiger roh sind, können je nach Wunsch des Benutzers shared_pointer und rohe Zeiger derselben Klasse verwendet werden. Deshalb kann ich nicht zwei verschiedene Klassen erstellen, denn wenn eine Funktion an einem Zeiger aufgerufen wird, sollte es die gleiche Funktion sein, sonst muss ich alle Funktionen überladen, was mir 2 ** n Funktionen bei der Funktion geben würde hat n Argumente. Das ist der Grund, warum ich versuche, eine Klasse zu erstellen, die je nach dem, was an den ctor übergeben wird, einen rohen Zeiger oder ein shared_ptr darstellt.

+2

Ist _have_ ein Konstruktor? Kann es stattdessen eine Factory-Funktion sein? – ildjarn

+3

Das sieht nach einer seltsamen Idee aus ... Was versuchst du genau zu machen? – Holt

+0

@ildjarn: Genau meine Idee :-) Erstellen Sie einen Generator/Fabrik, die Objekte auf Anfrage liefert. – Klaus

Antwort

1

Sie sollten einfach weiter variant<> verwenden, sondern Ihre große Klasse als Objekt zu speichern, speichern Sie es als Zeiger auch:

boost::variant<common_case*, huge_class*> 

Da Sie sagen, dass Sie in der Regel einen Zeiger speichern wie auch immer, dies nicht kostet Sie alles und stellt 100% des verschwendeten Speichers wieder her, weil alle Objektzeiger die gleiche Größe haben.

Verwandte Themen