gpt4 book ai didi

c++ - 引用模板参数类型的 static_assert

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:06 25 4
gpt4 key购买 nike

我正在尝试做的是这个简单的模板钳制功能。我想确保 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 开始,assert() 允许在 constexpr 函数中使用,但即使是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com