我想要做的是这个简单的模板钳位功能。
我想在运行时和编译时确保 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/

10-14 09:33