2009-10-07 13 views
8

A menudo, cuando se trabaja con plantillas, se termina con algo como:C++ plantilla de macro de acceso directo

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; 

    ... 
}; 

Esto es mucho de lo mismo, sin embargo, copiada a un montón de diferentes clases de plantilla. ¿Vale la pena crear algo como:

// 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; 

Así que mi clase sólo se convierte en:

#include "template_types.h" 

template <typename T> 
class the_class 
{ 
public: 
    TEMPLATE_TYPES(T) 
    ... 
}; 

Esto parece más limpio y evita la duplicación cuando hago otras clases de plantilla. ¿Es esto algo bueno? ¿O debería evitar esto y solo copiar y pegar typedefs?

Respuesta

15

Claro, lo que estás haciendo funcionaría, pero es como de la vieja escuela. ¿Has intentado poner esas cosas en otra clase de plantilla de la que puedas derivarte?

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

Gracias, ni siquiera pensé en eso. – Corey

+2

+1 Esta es también la razón por la cual heredar funtores de la función unaria y binaria. De hecho, tenía una pregunta relacionada, cómo uno ** usaría ** esos typedefs en the_class (suponiendo que se obtuvieran a través de un metaprogramación vudú), pero de http://www.parashift.com/c++-faq-lite/templates.html # faq-35.18 parece que no hay una * forma * significativa ... – UncleBens

+1

-1 de mí. No estoy de acuerdo con esta solución debido a la cuestión de "nombres que no se encuentran en una clase base dependiente". Toda referencia a uno de estos miembros debe calificarse de la siguiente manera: "typename template_defs ::". Por ejemplo, si desea hacer referencia a "const_reference", debería decir "typename template_defs :: const_reference", que en realidad no es mucho mejor. Sin embargo, una solución que mezcle la versión de macro con la plantilla podría estar bien. –

Cuestiones relacionadas