constexpr if: Funktion aufrufen, wenn sie existiert



  • Hallo

    Ich würde gerne mit constexpr if eine statische Funktion nur dann aufrufen, wenn sie existiert. Bisher habe ich das mit SFINAE erreicht.

    Ich habe folgendes probiert:

    // Gegeben sei ein Typ T:
    if constexpr(std::is_same<void (*)(), decltype(&T::foo)>::value)
    {
        T::foo();
    }
    

    Leider frisst der Compiler das nicht. Sollte dies gemäss C++17 gehen oder mache ich etwas falsch?


  • Mod

    Und wo siehst du da SFINAE?

    Edit: Mit dem Library Fundamentals TS 2:

    template <typename T>
    using detect_foo = std::enable_if_t<std::is_same_v<void (*)(), decltype(&T::foo)>>;
    
    if constexpr(std::is_detected_v<detect_foo, T>)
       ...
    else
       ...
    


  • Hallo

    Nein, das kann auch mit C++17 nicht funktionieren. Bei if muss die Bedingung in jedem Falle ein gültiger Ausdruck (oder eine gültige Deklaration) sein. Daran ändert auch constexpr nichts, denn sonst könnte die Implementierung gar nicht entscheiden, ob der Block ausgeführt wird oder nicht.
    Das Problem ist, dass im Ausdruck std::is_same<void (*)(), decltype(&T::foo)>::value der unevaluated operand &T::foo ill-formed ist, wenn sein name lookup fehlschlägt; sprich, wenn foo kein Member von T ist.

    LG



  • Arcoth schrieb:

    Und wo siehst du da SFINAE?

    Eben möglichst gar nicht. Ich wollte diese SFINAE Overloads vermeiden, da diese Funktion in meiner Template-Orgie bereits 1700x aufgerufen wird. Ich werde deinen Vorschlag mal ausprobieren, danke 🙂


Log in to reply