Souvent lorsque vous travaillez avec des modèles, vous vous retrouvez avec quelque chose comme:modèle de C raccourci macro
template <T>
class the_class
{
public:
// types
typedef T value_type;
typedef const value_type const_value_type;
typedef value_type& reference;
typedef const_value_type& const_reference;
typedef value_type* pointer;
typedef const_value_type* const_pointer;
...
};
Ce lot de la même chose, mais, copiés sur un bon nombre de différentes classes à modèle. Est-il utile de créer quelque chose comme:
// template_types.h
#define TEMPLATE_TYPES(T) \
typedef T value_type; \
typedef const value_type const_value_type; \
typedef value_type& reference; \
typedef const_value_type& const_reference; \
typedef value_type* pointer; \
typedef const_value_type* const_pointer;
Alors ma classe devient tout simplement:
#include "template_types.h"
template <typename T>
class the_class
{
public:
TEMPLATE_TYPES(T)
...
};
Cela semble plus propre et évite le double emploi quand je fais d'autres classes de modèle. Est-ce une bonne chose? Ou devrais-je éviter cela et juste copier-coller typedefs?
Merci, je n'y avais même pas pensé. – Corey
+1 C'est aussi la raison pour hériter des foncteurs des fonctions unaires et binaires. J'avais en fait une question connexe, comment on pourrait ** utiliser ** ces typedefs dans the_class (en supposant qu'ils soient obtenus à travers du métaprogramming vaudou) mais à partir de http://www.parashift.com/c++-faq-lite/templates.html # faq-35.18 il semble qu'il n'y ait pas de * sens * moyen ... – UncleBens
-1 de moi. Je ne suis pas d'accord avec cette solution en raison du problème des «noms non trouvés dans une classe de base dépendante». Toute référence à l'un de ces membres doit être qualifiée comme suit: "typename template_defs ::". Par exemple si vous voulez faire référence à "const_reference", vous devrez dire "typename template_defs :: const_reference" ce qui n'est pas vraiment mieux. Une solution qui mélange la version de la macro avec le modèle peut cependant être OK. –