8
votes

Nom variable de l'argument de modèle?

existe-t-il un moyen de générer le nom d'une variable à l'intérieur d'une classe basée sur un argument ? xxx

tel que ce que j'ai instancié est une variable de type t , avec l'identifiant t (où t est transmis par le programmateur, c'est-à-dire position Nous avons un t appelé la position ? ou est-ce que c'éloigne le concept méta-programmation de modèle un peu trop loin?: P


9 commentaires

1. Probablement pas possible. 2. Probablement une idée très cassée. 3. Pourquoi pensez-vous avoir besoin de cela? (4. Le préprocesseur peut le faire, mais ce n'est pas une réponse acceptable)


Laissez-moi deviner: parce qu'il est un ancien programmeur PHP ;-)


Oui, je sais que c'est obscur! Je suis en train de mettre en œuvre un type de vertex modèles générique, où chaque composant d'un sommet a à la fois un type (c'est-à-dire flottant [3] ou vector3d - et une utilisation, c'est-à-dire usage_normal, usage_position, etc. J'aimerais pouvoir construire des sommets En passant des arguments de modèle et en utilisant une récursion de gabarits pour construire une structure de la même manière: EntropyGames.net/...


@Robinson, alors pourquoi ne pas utiliser Enums pour représenter l'utilisation?


Désolé, je n'ai pas fini mon commentaire ... fut dupé en appuyant sur le bouton ENTER! Je construisais de manière récursive une structure de sommet des arguments de modèle. Mais en utilisant cette méthode, je ne peux pas avoir, disons, deux des mêmes "TYPE" ENUM, car la spécialisation leur donne le même identifiant.


@Robinson, les modèles peuvent également se spécialiser par valeur - non seulement. Par exemple: modèle struct foo; tant que la valeur est un type de constante ou d'énumération intégré. Donc, si vous aviez une "utilisation enum" appelée usage , vous pouvez créer un modèle comme modèle struct foo; , puis le spécialisez-le comme vous le souhaitez. chaque type énuméré.


En référence à l'URL que vous avez fourni pourquoi ne pouvez-vous pas simplement avoir modèle <> struct vertex_part {vecteur normal; }; à côté de la spécialisation pour UASGE_POSITION_3F? Est-ce que je manque quelque chose?


@Robinson: Je serais intéressé par votre opinion sur la réponse que j'ai fournie.


Hey Utilisateur, je vais y jeter un coup d'œil plus en détail plus tard. J'ai résolu ce petit problème en changeant complètement mon approche. J'ai une structure variante qui correspond directement à un tampon Vertex OpenGL / D3D et je stocke un tableau de ceux-ci pour constituer un sommet. Toutes les méta-données sont dans la structure et le nom est la clé de chaîne (ou l'index) dans le tableau des méta-éléments. Cela fonctionne bien car je n'ai pas besoin d'un accès fréquent à bas niveau à des composants de sommet individuels en dehors des shaders. Pourrait être un problème de performance si je le fais jamais.


3 Réponses :


6
votes

Non, vous ne pouvez pas y parvenir avec des modèles. Les noms de variables (appelés «identifiants») ne peuvent pas être manipulés de manière programmée par des modèles. Seul le préprocesseur peut faire cela.

Peu importe, cela semble être une mauvaise idée. Pourquoi êtes-vous veux pour faire cela?


1 commentaires

Ok, comme je soupçonnais :(. Merci Charles.



7
votes

Non, pas avec cette syntaxe, mais vous pouvez créer une configuration similaire à ce que vous essayez de faire:

template < typename Field >
struct field_value
{
  typename Field::type value;
};

template < typename Seq >
struct funky_struct : boost::mpl::inherit_linearly
  <
    Seq
  , boost::mpl::inherit
    <
      field_value< boost::mpl::placeholders::_2>
    , boost::mpl::placeholders::_1
    >
  >::type
{};

template < typename Field, typename Struct >
typename Field::type & get(Struct & s) { return static_cast< field_value<Field>& >(s).value; }

struct first_field { typedef int type; };
struct second_field { typedef char type; };

struct my_funky : funky_struct< boost::mpl::vector<first_field,second_field> > {};

...
my_funky f;
get<first_field>(f) = 23;


1 commentaires

+1 Je fais quelque chose de similaire dans une classe que j'ai écrite qui énumère les champs de messages entrants



5
votes

Quelque chose comme ce que vous voulez atteindre peut être accompli avec héritage. C'est-à-dire que la classe des parents a le nom de la variable que vous souhaitez que votre modèle soit.

#define MAKE_HAS(X) template <typename T> struct Has##X { T X; }

MAKE_HAS(Position);
MAKE_HAS(Momentum);
MAKE_HAS(Name);


0 commentaires