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,否则通常的动态断言会做什么?
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)