enable_if bei Typumwandlungsoperator
-
Wie kann ich mithilfe von enable_if (oder eine andere zur Compilerzeit mögliche) zwischen den beiden Funktionen unterscheiden?
template <typename T> struct Foo { T t; operator Bar() const // T is floating point { return Bar(std::round(t)); } operator Bar() const // T is non-floating point { return Bar(t); } };
-
template <typename T> struct Foo { T t; template <typename U, typename std::enable_if<std::is_same<U, typename std::conditional<std::is_floating_point<T>::value, Bar, void>::type>::value, int>::type = 0> operator U() const // T is floating point { return Bar(std::round(t)); } template <typename U, typename std::enable_if<std::is_same<U, typename std::conditional<!std::is_floating_point<T>::value, Bar, void>::type>::value, int>::type = 0> operator U() const // T is non-floating point { return Bar(t); } };template <typename U, typename std::enable_if<std::is_floating_point<T>::value && std::is_same<U, Bar>::value, int>::type = 0> operator U() const // T is floating point { return Bar(std::round(t)); }funktioniert wahrscheinlich auch.
-
Besten Dank!
Warum macht man denn den Umweg über is_same und U?
-
Cyres schrieb:
Besten Dank!
Warum macht man denn den Umweg über is_same und U?
Weil SFINAE ein Funktionstemplate voraussetzt, nicht einfach nur ein einfaches Member eines (Klassen-)templates.