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;
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 *
?
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
und danke für die schnelle Antwort! – tony
@tony Harder und weniger portabel als Sie denken würden: http://StackOverflow.com/q/1055452/501250 – cdhowie