C/C++/macro modèle de blackmagic pour générer nom unique

Les Macros sont très bien.
Les modèles sont beaux.
Assez bien ce que ça fonctionne bien.

L'exemple est OpenGL; mais la technique est le C++ spécifiques et s'appuie sur aucune connaissance de l'OpenGL.

Problème précis:

J'ai envie d'une expression E; où je n'ai pas à indiquer un nom unique, à tel point qu'un constructeur est appelé où E est défini, et un destructeur est appelé lorsque le bloc E est dans les extrémités.

Par exemple, pensez à:

class GlTranslate {
  GLTranslate(float x, float y, float z); {
    glPushMatrix();
    glTranslatef(x, y, z);
  }
  ~GlTranslate() { glPopMatrix(); }
};

Solution manuelle:

{
  GlTranslate foo(1.0, 0.0, 0.0); //I had to give it a name
  .....
} //auto popmatrix

Maintenant, j'ai ce non seulement pour glTranslate, mais beaucoup d'autres PushAttrib/PopAttrib appels trop. Je préférerais ne pas avoir à venir avec un nom unique pour chaque var. Est-il une astuce impliquant des macros modèles ... ou quelque chose d'autre qui va automatiquement créer une variable qui est constructeur est appelé au moment de la définition; et destructeur appelé à la fin du bloc?

Merci!

  • Je ne vois pas pourquoi la pensée d'un nom unique est plus que de l'exécution de certains complexes appel de macro.
  • Pour ce que ça vaut, j'ai essayé un régime similaire à once upon a time. J'ai trouvé qu'il était plus facile de simplement faire une certaine forme de Transformation classe qui avait push/pop comme vous avez, avec les fonctions de membres qui font appels à traduire, etc. Vous n'avez plus qu'une seule classe, et vous êtes également à seulement pousser quand vous en avez besoin.
  • Je pense que la réponse est LIGNE: ou COMPTEUR 🙂
  • ah, bon point, parce que j'ai à payer un supplément de glPushMatrix() pour tous les non-autochtones de traduire dans mon régime
  • Peut-être: GlTranslate(1.0, 0.0, 0.0), work_to_be_done_in_block(...);
  • Pourriez-vous développer ce que?
  • Je suggère (pas tout à fait au sérieux) pour transformer les blocs d'une seule virgule expression. Autant que je sache, temporaires sont détruits après la pleine expression est évaluée (après work_to_be_done appel...) => pas besoin de donner un nom à l'instance, pas même un seul 😉
  • haha voir ci-dessous pour l'opérateur virgule ruse xD

InformationsquelleAutor anon | 2010-03-10