2009-10-07 24 views
8

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?

risposta

15

Certo, quello che stai facendo funzionerebbe, ma è una specie di vecchia scuola. Hai provato a mettere quella roba in un'altra classe di template da cui potresti derivare?

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

Grazie, non ci ho nemmeno pensato. – Corey

+2

+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

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