我在库中有几个简短的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