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?
-
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 auchconstexpr
nichts, denn sonst könnte die Implementierung gar nicht entscheiden, ob der Block ausgeführt wird oder nicht.
Das Problem ist, dass im Ausdruckstd::is_same<void (*)(), decltype(&T::foo)>::value
der unevaluated operand&T::foo
ill-formed ist, wenn sein name lookup fehlschlägt; sprich, wennfoo
kein Member vonT
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