std::enable_if Frage



  • Hallo,

    template <typename T>
    std::ostream& operator<<(std::ostream& os, const T& response)
    {
        [...]
        return os;
    }
    

    Davon möchte ich nur eine Template Instanziierung haben wenn T eine Klasse ist.

    template <typename T>
    typename std::enable_if<std::is_class<T>::value, T>::type
    operator<<(std::ostream& os, const T& response)
    {
        [...]
        return os;
    }
    

    ... ist mein Ansatz bisher. Das habe ich aber nur aus der Doku herauskopiert, wirklich verstehen was da geschieht tue ich nicht. Es kompiliert so auch nicht.

    Kann mir jemand sagen wie man es richtig macht (und optimalerweise auch erklären was das typename an dieser Stelle genau bewirkt etc.)

    Grüße


  • Mod

    Davon möchte ich nur eine Template Instanziierung haben wenn T eine Klasse ist.

    Das macht keinen Sinn. Für alle arithmetischen Datentypen (und einige Zeiger) wurde operator<< überladen und wird bei overload resolution bevorzugt. Warum also rausschmeissen wenn es wahrscheinlich eh nicht genommen wird?

    Der Grund warum es bei dir nicht klappt ist übrigens der dass das zweite Template-Argument std::ostream& sein sollte (welches typename ..::type entspricht, deinem Rückgabetyp). Warum das typename da hin sollte wirst du mit etwas Googeln selbst herausfinden (Tipp: Schau auf Stackoverflow, dort gibt es eine gute Antwort.)


Anmelden zum Antworten