Ich habe mehrere kurze constexpr
Funktionen in meinen Bibliotheken, die einige einfache Berechnungen durchführen. Ich benutze sie sowohl in Laufzeit- als auch in Kompilierungskontexten.Alternative zu Constexpr Funktionen
ich einige Behauptungen im Körper dieser Funktionen ausführen möchte jedoch assert(...)
in einer constexpr
Funktion nicht gültig ist und static_assert(...)
nicht verwendet werden kann, Funktionsparameter zu überprüfen.
Beispiel:
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert(mMin <= mMax); // does not compile!
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
Gibt es eine Möglichkeit zu Check, ob die Funktion in einer Laufzeit oder kompilieren-Zeitkonstante und führen Sie die assert
nur dann ausgeführt wird, wenn es während der Laufzeit ausgeführt wird, ist ?
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert_if_runtime(mMin <= mMax);
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
@dasblinkenlight: Was ich meinte ist, dass 'static_assert' [macht keinen Sinn in dieser Gelegenheit] (http://ideone.com/6yjdAE). –
(Haftungsausschluss: Ich bin ein Noob und nie ein conetexpr im wirklichen Leben verwendet.) Basierend auf meiner ersten Google-Suche, es sei denn, Ihr Compiler unterstützt [N3652] (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2013/n3652.html) die C++ 11 "constexpr" entspannt, kann es nicht tun, wonach Sie fragen. Sobald dies verfügbar ist, können Sie eine Ausnahme wie 'std :: range_error' anstelle eines' static_assert' auslösen. Sie können Ihre Hand mit [Clang 3.4 mit std = C++ 14] versuchen (http://clang.llvm.org/cxx_status.html). – rwong
Ihr Anspruch ist nicht wahr für Clang im '-std = C++ 1y'-Modus, Assert wird gut funktionieren.Sie sollten auf "C++ 11" zurückschreiben, wenn Sie auf diesen Standard beschränkt sind. – TemplateRex