2009-10-07 11 views
8

Oft, wenn das Arbeiten mit Vorlagen, beenden Sie mit so etwas wie oben:C++ Vorlage Makro Abkürzung

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; 

    ... 
}; 

Das ist viel von dem gleichen Stoffe, aber von verschiedenen Templat-Klassen viel kopiert. Lohnt es sich, so etwas wie zu erstellen:

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

Also meine Klasse nur wird:

#include "template_types.h" 

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

Dies scheint sauberer und vermeidet Doppelarbeit, wenn ich andere Template-Klassen machen. Ist das eine gute Sache? Oder sollte ich das vermeiden und nur typedefs kopieren?

Antwort

15

Sicher, was Sie tun, würde funktionieren, aber es ist irgendwie Old-School. Haben Sie versucht, dieses Zeug in eine andere Vorlagenklasse zu legen, von der Sie ableiten könnten?

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

Danke, daran habe ich nicht einmal gedacht. – Corey

+2

+1 Dies ist auch der Grund, warum Funktoren von unären und binären Funktionen erben. Ich hatte tatsächlich eine verwandte Frage, wie man ** diese Typedefs in der Klasse verwenden würde (angenommen, sie würden durch einige Metaprogrammierungs-Voodoo erhalten), aber von http://www.parashift.com/c++faq-lite/templates.html # faq-35.18 es scheint, es gibt keine * sinnvolle * Weise ... – UncleBens

+1

-1 von mir. Ich stimme dieser Lösung aufgrund des Problems "Namen nicht in einer abhängigen Basisklasse gefunden" nicht zu. Jeder Verweis auf eines dieser Mitglieder muss wie folgt qualifiziert werden: "typename template_defs ::". Wenn Sie beispielsweise auf "const_reference" verweisen möchten, müssen Sie "typename template_defs :: const_reference" sagen, was nicht wirklich viel besser ist. Eine Lösung, die die Makroversion mit der Vorlage mischt, ist jedoch möglicherweise in Ordnung. –