2014-09-02 4 views
5

Es gibt eine Reihe von Möglichkeiten, um eine has_type<T> Vorlage zu implementieren, die ableitet, ob T eine geschachtelte Klasse oder typedef namens type hat.has_type-Vorlage gibt true für den Strukturtyp {} zurück;

dh
namespace detail { 
    template<typename> struct tovoid { typedef void type; }; 
} 

template<typename T, typename = void> struct has_type 
    : std::false_type { }; 
// this one will only be selected if C::type is valid 
template<typename C> struct has_type<C, typename detail::tovoid<typename C::type>::type> 
    : std::true_type { }; 

Oder

template <typename C> char test_for_type(...) { return '0'; } 
template <typename C> double test_for_type(typename C::type const *) { return 0.0; } 

template <typename T> struct has_type 
{ 
    static const bool value = sizeof(test_for_type<T>(0)) == sizeof(double); 
}; 

jedoch in jedem Fall has_type<type>::value ist true für diese Klasse:

struct type 
{ 
}; 

Nun ist die oben type keine andere type in ihm verschachtelt, aber Es hat einen Konstruktor type::type().

Aber sollte dieser Konstruktor die Prüfungen für den verschachtelten Typ 'auslösen'? Oder ist es ein Compilerfehler? (Ich würde gerne glauben, dass typename type::type nicht auf einen Konstruktor zuzutraf und/oder dass man kann nicht einen Zeiger auf einen Konstruktor übernehmen, wie zum Beispiel, was mit dem zweiten Testverfahren erzeugt werden würde. typename type::type const *

?

Antwort

5

der Name einer Klasse wird in den Gültigkeitsbereich der Klasse „injiziert“, so type::type wirklich der Name einer Art ist, und es ist der gleiche Typ wie ::type.

+1

Ah, wahr. und ich denke, 'struct Typ {struct Typ {};}; 'ist ungültig, wie auch' struct type {typedef int type;}; '. Was meine nächste Frage beantwortet - wie man mit diesem Fall umgeht (wenn ich es wirklich wollte) von ch ecking, wenn T benannt ist, sollte nicht zu hart sein. – tony

+0

und danke für die schnelle Antwort! – tony

+0

@tony Harder und weniger portabel als Sie denken würden: http://StackOverflow.com/q/1055452/501250 – cdhowie