Etwas, was Sie erreichen wollen, kann mit Vererbung erreicht werden. Das heißt, die Elternklasse hat den Variablennamen, den Ihre Vorlage haben soll.
struct ItemNull {};
template <typename X, typename Y = ItemNull>
class Item : public X, public Y {};
template <typename T> struct HasPosition { T Position; };
template <typename T> struct HasMomentum { T Momentum; };
Item< HasPosition<float> > myItem1;
myItem1.Position = 0.123f;
Item< HasPosition<float>, HasMomentum<float> > myItem2;
myItem2.Position = 0.1f;
myItem2.Momentum = 0.2f;
Das optionale zweite Argument ermöglicht die Zusammensetzung, wie in myItem2
dargestellt. Um ein drittes Feld hinzufügen, könnten Sie an den Schwanz hinzufügen oder erweitern von vorne:
template <typename T> struct HasName { T Name; };
Item <
HasPosition<float>,
Item< HasMomentum<float>, HasName<std::string> >
> myItem3;
myItem3.Position = 0.1f;
myItem3.Momentum = 0.2f;
myItem3.Name = "Adam";
Item <
Item < HasPosition<float>, HasMomentum<float> >,
HasName<std::string>
> myItem4;
myItem4.Position = 0.1f;
myItem4.Momentum = 0.2f;
myItem4.Name = "Adam";
Meine persönlichen Präferenz ist für die ehemaligen der beiden Methoden, weil ich es als eine intuitive Art und Weise finden zu erweitern es über 3 Felder hinaus. Die Vorlagensyntax Item
könnte wahrscheinlich mithilfe variadischer Vorlagenargumente vereinfacht werden.
Die Vorlagen Has...
könnten maschinengeneriert sein, oder es könnte ein Makro erstellt werden, um das Hinzufügen neuer Felder zu einer relativ einfachen Aufgabe zu machen.
#define MAKE_HAS(X) template <typename T> struct Has##X { T X; }
MAKE_HAS(Position);
MAKE_HAS(Momentum);
MAKE_HAS(Name);
1. Voraussichtlich nicht möglich. 2. Wahrscheinlich eine sehr kaputte Idee. 3. Warum denkst du, dass du das brauchst? (4. Der Präprozessor kann das, aber das ist keine akzeptable Antwort) – delnan
Lass mich raten: weil er früher PHP-Programmierer ist ;-) –
Ja, ich weiß, dass es obskur ist! Ich implementiere einen generischen Template-Vertex-Typ, wobei jede Komponente eines Vertex sowohl einen Typ (zB float [3] oder Vector3d - und eine Verwendung, dh usage_normal, usage_position usw. hat.) Ich möchte in der Lage sein, Vertices zu konstruieren durch Übergeben von Vorlagenargumenten und Verwenden der Vorlagenrekursion zum Erstellen einer Struktur auf ähnliche Weise: http://www.entropygames.net/index.php?option=com_content&view=article&id=51:generic-vertices&catid=37:articles&Itemid = 56 – Robinson