我在庫中有幾個簡短的constexpr
函數,它們執行一些簡單的計算。我在運行時和編譯時都使用它們。對constexpr函數斷言的替代
我想在這些函數的主體中執行一些斷言,但assert(...)
在constexpr
函數中無效,並且static_assert(...)
不能用於檢查函數參數。
例子:
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert(mMin <= mMax); // does not compile!
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
有沒有辦法來檢查是否功能在運行時正在執行或編譯時間常數和執行assert
只有當它在運行時執行?
constexpr int getClamped(int mValue, int mMin, int mMax) noexcept
{
assert_if_runtime(mMin <= mMax);
return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue);
}
@dasblinkenlight:我的意思是'static_assert' [在這種情況下沒有意義](http://ideone.com/6yjdAE)。 – 2014-09-27 08:28:29
(免責聲明:我是一個noob,在現實生活中從未使用過constexpr。)基於我最初的Google搜索,除非您的編譯器支持[N3652](http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2013/n3652.html),它放鬆了C++ 11'constexpr',它不能做你所要求的。一旦這個可用,你將能夠拋出一個異常,例如'std :: range_error'來代替'static_assert'。你可以用[Clang 3.4 with std = C++ 14](http://clang.llvm.org/cxx_status.html)來試試你的手。 – rwong 2014-09-27 09:06:00
你的聲明在'-std = C++ 1y'模式下對Clang來說不是真的,assert會工作得很好。如果您僅限於該標準,您應該重新使用「C++ 11」。 – TemplateRex 2014-09-27 22:14:45