Sehr verspätete Nachfrage



  • Ich hatte mal eine Frage gestellt ob man auf eine vorhandene Funktionsüberladung prüfen kann.

    volkard antwortete hiermit: https://www.c-plusplus.net/forum/p2388785#2388785

    Diese Zeile

    static char (&check(decltype(js_stringify(declval<U>()))*))[2];
    

    verstehe ich jedoch nicht so ganz.
    static char (&func(...)*)[2] ? Was ist das für Vodoo?
    Ich glaube das ich das nicht verstehe wegen der zwei 'unevaluated contexts' in sizeof und decltype. Aber bevor ich Unsinn spekuliere, lass ichs einfach.

    (Ich mache das übrigens mittlerweile so):

    template <typename T>
    struct has_function_overload {
    private:
        // my function here is named func and just takes one param.
        // my actual case is a little bit more complex
        template <typename U, typename = decltype(func(std::declval <U const&>()))>
        static bool_ <true> try_(U&&);
        static bool_ <false> try_(...);
    
    public:
        using type = decltype(try_(std::declval<T>()));
    };
    

    Aber ich kann es einfach nicht ausstehen etwas nicht erklären zu können würde mich jemand fragen wie es funktioniert.


  • Mod

    Ich hoffe mal, ich entziffere das richtig:
    Das ist eine (static) Funktion namens check , die eine Referenz auf ein Array aus 2 chars zurück gibt. Die Funktion hat als Argument einen Zeiger auf den Typ decltype(js_stringify(declval<U>())) , sprich dem Rückgabetyp der Funktion js_stringify, wenn man sie mit einem Wert vom Typ U aufrufen würde. Da dieser Typ nur existiert, wenn es eine passende Überladung für js_stringify für den Typen U gibt, ist diese Funktion check nach SFINAE nur dann eine mögliche Überladung für das Argument 0 (also den Nullzeiger, siehe Zeile 18), wenn es diesen Typen überhaupt gibt. Ansonsten greift die andere Überladung von check mit der Ellipse (Zeilen 13-14 in volkards Code), die nur einen einzelnen char zurück gibt. So kann anhand des Rückgabetyps des hypothetischen Funktionsaufrufs in Zeile 18 unterschieden werden, welche der beiden Überladungen von check gewählt wurden. Wenn die Überladung mit dem Funktionszeiger in Frage kommt, dann hat sie nämlich immer Vorrang vor der anderen Überladung mit der Ellipse. Und dann muss es logischerweise auch die passende Überladung von js_stringify geben, denn sonst käme diese Überladung von check nicht in Frage. Wenn umgekehrt diese Überladung von check nicht in Frage kommt, dann kann dies nur da dran liegen, dass es keine passende Überladung von js_stringify gibt.


Log in to reply