2009-10-07 8 views
8

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?

Répondre

15

Bien sûr, ce que vous faites fonctionnerait, mais c'est un peu la vieille école. Avez-vous essayé de mettre ces choses dans une autre classe de modèle que vous pourriez dériver?

template <typename T> 
class template_defs 
{ 
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; 
}; 

template <typename T> 
class the_class : public template_defs<T> 
... 
+1

Merci, je n'y avais même pas pensé. – Corey

+2

+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

-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. –