我想要做的是这个简单的模板钳位功能。
我想在运行时和编译时确保 upper >= lower
。
template <typename T>
T clamp(const T& lower, const T& upper, const T& n)
{
weak_assert(upper >= lower);
return std::max(lower, std::min(n, upper));
}
写起来似乎很合理:
static_assert(upper >= lower, "invalid bounds");
但是,当使用非
constexpr
参数调用时,编译器给了我这个:Static_assert expression is not an integral constant expression
In instantiation of function template specialization 'clamp<int>' requested here
有什么方法可以正确实现这一目标吗?当使用
constexpr
调用时(比如 clamp<int>(0, 10, myvar)
应该触发 static_assert,否则通常的动态断言会怎样? 最佳答案
从 C++14 开始,constexpr 函数中允许使用 assert()
,但即使使用 C++11,您也可以使用 operator ,
来欺骗它:
#include <cassert>
template <typename T>
constexpr T clamp(const T& lower, const T& upper, const T& n)
{
return assert(upper >= lower), std::max(lower, std::min(n, upper));
}
关于c++ - 引用模板参数类型上的 static_assert,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41909079/