Quelque chose comme ce que vous voulez réaliser peut être accompli avec l'héritage. Autrement dit, la classe parente a le nom de la variable que vous voulez que votre modèle ait.
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;
Le second argument optionnel permet une composition, comme illustré sur myItem2
. Pour ajouter un troisième champ, vous pouvez ajouter à la queue, ou d'étendre à l'avant:
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";
Ma préférence personnelle est pour l'ex-des deux méthodes, parce que je trouve être une façon plus intuitive d'étendre au-delà de 3 champs. La syntaxe du modèle Item
pourrait probablement être simplifiée en utilisant des arguments de modèle variadique. Les modèles Has...
peuvent être générés par une machine ou une macro peut être créée pour rendre l'ajout de nouveaux champs une tâche relativement simple.
#define MAKE_HAS(X) template <typename T> struct Has##X { T X; }
MAKE_HAS(Position);
MAKE_HAS(Momentum);
MAKE_HAS(Name);
1. Propablement pas possible. 2. Propably une idée très brisée. 3. Pourquoi pensez-vous que vous en avez besoin? (4. Le préprocesseur peut le faire, mais ce n'est pas une réponse acceptable) – delnan
Laisse-moi deviner: parce qu'il est un ancien programmeur PHP ;-) –
Oui, je sais que c'est obscur! J'implémente un type de vertex générique basé sur un template, où chaque composant d'un vertex possède à la fois un type (float [3] ou Vector3d) et un usage, ie usage_normal, usage_position, etc. J'aimerais pouvoir construire des sommets en transmettant des arguments de modèle et en utilisant la récursivité modèle pour construire une structure, de la même manière: http://www.entropygames.net/index.php?option=com_content&view=article&id=51:generic-vertices&catid=37:articles&Itemid = 56 – Robinson