首页 > 解决方案 > C++ 模板如何处理溢出?

问题描述

我已经实现了一个模板函数“clamp”,因为我的项目不支持 C++20。

template<typename T>
constexpr const T clamp(const T& value, const T& lo, const T& hi)
{
    return static_cast<T>(std::min(std::max(lo, value), hi));
}

我正在使用它以下列方式检查溢出。

if (adcVal > clamp<uint16_t>((adcHi + voltageThreshold), adcHi, std::numeric_limits<uint16_t>::max()))
{
    //voltage has jumped past required threshold. 
}

是否保证溢出值将保留为uint16_t

标签: c++templatestypesoverflow

解决方案


是否保证溢出值将保留为 uint16_t?

我怀疑你的意思是溢出adcHi + voltageThreshold。我假设操作数是uint16_t.

不,没有这样的保证。在典型系统上,uint16_t操作数首先会被提升为int,结果也将是int。并且总和可能超出 的可表示值uint16_t

当然,一旦加法的结果被转换为uint16_t当传递给时clamp,它就保证是一个uint16_t

传递std::numeric_limits::max()给钳位将意味着输入不会从上限钳位,因为它永远不会大于限制。

C++ 模板如何处理溢出?

溢出发生在调用函数模板之前。


推荐阅读