Spesso quando si lavora con i modelli, si finisce con qualcosa di simile:template C++ macro scorciatoia
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;
...
};
Si tratta di una sacco di le stesse cose, però, copiato in un sacco di diverse classi su modelli. Vale la pena di creare qualcosa di simile:
// 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;
Quindi la mia classe diventa solo:
#include "template_types.h"
template <typename T>
class the_class
{
public:
TEMPLATE_TYPES(T)
...
};
Questo sembra più pulito e evita la duplicazione quando faccio altre classi template. È una buona cosa? O dovrei evitare questo e copiare solo typedef?
Grazie, non ci ho nemmeno pensato. – Corey
+1 Questo è anche il motivo per cui ereditare i funtori dalla funzione unaria e binaria. In realtà avevo una domanda correlata, come si dovrebbe ** usare ** i typedef in the_class (supponendo che siano ottenuti attraverso alcuni metaprogrammazione del voodoo) ma da http://www.parashift.com/c++-faq-lite/templates.html # faq-35.18 sembra che non ci sia * modo significativo * ... – UncleBens
-1 da parte mia. Non sono d'accordo con questa soluzione a causa del problema "nomi non trovati in una classe di base dipendente". Ogni riferimento a uno di questi membri deve essere qualificato come segue: "typename template_defs ::". Ad esempio se vuoi fare riferimento a "const_reference", dovresti dire "typename template_defs :: const_reference" che non è molto meglio. Una soluzione che miscela la versione macro con il modello, tuttavia, potrebbe essere OK. –