static_assert参考模板参数类型

Hed*_*din 4 c++ templates c++11

我想要做的是这个简单的模板钳功能.我想确保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));
}
Run Code Online (Sandbox Code Playgroud)

写一下似乎是合理的:

static_assert(upper >= lower, "invalid bounds");
Run Code Online (Sandbox Code Playgroud)

但是,当使用非constexpr参数调用时,编译器会给我:

Static_assert expression is not an integral constant expression
In instantiation of function template specialization 'clamp<int>' requested here
Run Code Online (Sandbox Code Playgroud)

有没有办法正确实现这一目标?调用时constexpr(比如说,clamp<int>(0, 10, myvar)应该触发static_assert,否则通常的动态断言会做什么?

kam*_*aze 6

assert()在constexpr函数中允许以C++ 14 开头,但即使使用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));
}
Run Code Online (Sandbox Code Playgroud)