typetraits für template Class Spezialisierung, wie geht das?
-
Hallo,
Ich würde gerne, abhängig davon ob ein Typ default constuctable ist, unterschiedliche Spezialisierungen bereitstellen
Konzeptuell ungefähr so:
tempalte<typename T> struct Foo<T, true> { // skip private: T t ; }; tempalte<typename T> struct Foo<T, false> { // skip private: T* t; };
und das
tempalte<typename T, std::is_default_constructible<T>::value> struct Foo ;
liefert eines der obigen.
So geht das halt nicht, nur,
wie schaut der funktionierende Syntax aus?
-
Du suchst wohl sowas hier:
template <typename T, typename = void> struct foo; template <typename T> struct foo<T, std::enable_if_t<std::is_default_constructible<T>::value>> { }; template <typename T> struct foo<T, std::enable_if_t<!std::is_default_constructible<T>::value>> { };
Das ist etwas flexibler, da es mit dieser Signatur nicht nur zwei, sondern beliebig viele Spezialisierungen erlaubt (Eindeutigkeit vorausgesetzt).
Wenns unbedingt einbool
-Parameter statt eines Typs sein soll, kann man das auch so schreiben (wie in deinem Code):template <typename T, bool = std::is_default_constructible<T>::value> struct foo { }; template <typename T> struct foo<T, true> { }; template <typename T> struct foo<T, false> { };
Gruss,
Finnegan
-
vielen Dank Finnegan!
die erste Version schaut etwas mehr so aus wie ich es eigentlich möchte.
ich verstehe sie aber nicht ganz.
Wieso ist das eindeutig.wird das nicht 2x zu true erweitert?
ungefähr sotemplate <typename T> //struct foo<T, std::enable_if_t<std::is_default_constructible<T>::value>> struct foo<T, true> { }; template <typename T> //struct foo<T, std::enable_if_t<!std::is_default_constructible<T>::value>> struct foo<T, true> { }
und warum braucht die erste Version keine Implementierung der letztendlich nicht verwendenden Vorlage
template <typename T, typename = void> struct foo;
die zweite jedoch schon
template <typename T, bool = std::is_default_constructible<T>::value> struct foo { };
was letztendlich auch mein original Problem erklären dürfte?
-
kurze_frage schrieb:
wird das nicht 2x zu true erweitert?
Beachte das Ausrufezeichen und die tatsache, dass es sich bei
std::enable_if_t<std::is_default_constructible<T>::value>
nicht um einenbool
-Ausdruck,
sondern um einen Typen handelt der nur dann korrekt definiert ist, wenn dieenable_if
-Bedingung wahr ist (Details sieheenable_if
und SFINAE im Allgemeinen).kurze_frage schrieb:
und warum braucht die erste Version keine Implementierung der letztendlich nicht verwendenden Vorlage
Sie hat eine Implementierung, je eine für beide Fälle, die überhaupt eintreten können.
kurze_frage schrieb:
die zweite jedoch schon
Braucht sie eigentlich nicht, die Klammern sind mir da so "reingerutscht".
Begründung ist die selbe wie für die erste Version: Alle Fälle sind abgedeckt, es wird keine "Default"-Implementierung benötigt.Finnegan