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
ifmuss die Bedingung in jedem Falle ein gültiger Ausdruck (oder eine gültige Deklaration) sein. Daran ändert auchconstexprnichts, 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)>::valueder unevaluated operand&T::fooill-formed ist, wenn sein name lookup fehlschlägt; sprich, wennfookein Member vonTist.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
