2009-10-07 14 views
8

Często podczas pracy z szablonami, możesz skończyć z czymś takim:C++ szablonu makro skrót

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; 

    ... 
}; 

Jest dużo o tej samej rzeczy, choć skopiowany do wielu różnych zajęć na matrycy. Czy warto stworzyć coś takiego:

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

Więc moja klasa po prostu staje się:

#include "template_types.h" 

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

Wydaje czystsze i unika powielania kiedy dokonać innych klas szablonu. Czy to dobrze? Czy powinienem tego uniknąć i po prostu skopiować i wkleić typedefs?

Odpowiedz

15

Jasne, to, co robisz, będzie działało, ale jest to rodzaj starej szkoły. Czy próbowałeś umieścić te rzeczy w innej klasie szablonu, z której możesz czerpać?

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

Dzięki, nawet o tym nie pomyślałem. – Corey

+2

+1 Jest to również powód, dla którego dziedziczymy funktory z funkcji unarnej i binarnej. Miałem właściwie powiązane pytanie, w jaki sposób ** wykorzystywać ** te typedefs w the_class (zakładając, że są uzyskiwane przez niektóre metaprogramowanie voodoo), ale z http://www.parashift.com/c++-faq-lite/templates.html # faq-35.18 wydaje się, że nie ma * znaczącego * sposobu ... – UncleBens

+1

-1 ode mnie. Nie zgadzam się z tym rozwiązaniem z powodu problemu "nie znaleziono nazw w zależnej klasie podstawowej". Każde odniesienie do jednego z tych elementów musi zostać zakwalifikowane w następujący sposób: "nazwa_pliku template_defs ::". Na przykład, jeśli chcesz odwołać się do "const_reference", musisz powiedzieć "nazwa_pliku template_defs :: const_reference", co nie jest dużo lepsze. Rozwiązanie, które łączy makrową wersję z szablonem, może być jednak w porządku. –