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?
Gracias, ni siquiera pensé en eso. – Corey
+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 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. –