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?
Dzięki, nawet o tym nie pomyślałem. – Corey
+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 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. –