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 ein bool -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 so

    template <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 einen bool -Ausdruck,
    sondern um einen Typen handelt der nur dann korrekt definiert ist, wenn die enable_if -Bedingung wahr ist (Details siehe enable_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


Anmelden zum Antworten