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);
        }
    };
    

  • Mod

    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?


  • Mod

    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.


Anmelden zum Antworten