Ho alcune brevi funzioni constexpr
nelle mie librerie che eseguono alcuni semplici calcoli. Li uso entrambi in contesti run-time e in fase di compilazione.Alternativa alle affermazioni per le funzioni di constexpr
Desidero eseguire alcune affermazioni nel corpo di queste funzioni, tuttavia assert(...)
non è valido in una funzione constexpr
e static_assert(...)
non può essere utilizzato per controllare i parametri di funzione.
Esempio:
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert(mMin <= mMax); // does not compile!
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
C'è un modo per controllo se la funzione è stata eseguita in un runtime o fase di compilazione costante ed eseguire la assert
solo se è in esecuzione in fase di esecuzione ?
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert_if_runtime(mMin <= mMax);
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
@dasblinkenlight: Ciò che intendevo è che 'static_assert' [non ha senso in questa occasione] (http://ideone.com/6yjdAE). –
(Disclaimer: Sono un noob e non ho mai utilizzato un constexpr nella vita reale.) Basato sulla mia ricerca iniziale di Google, a meno che il compilatore non supporti [N3652] (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2013/n3652.html) che rilassa il 'constexpr' di C++ 11, non può fare quello che chiedi. Una volta disponibile, sarai in grado di lanciare un'eccezione come 'std :: range_error' al posto di un' static_assert'. Puoi provare la tua mano usando [Clang 3.4 con std = C++ 14] (http://clang.llvm.org/cxx_status.html). – rwong
il tuo reclamo non è vero per Clang in modalità '-std = C++ 1y', asserirà che funzionerà bene.dovresti tornare a 'C++ 11' se sei limitato a quello standard. – TemplateRex