【发布时间】:2018-09-14 10:32:16
【问题描述】:
我正在编写一堆应用数学/信号处理/算法 C++ 代码。
我已启用-Wconversion 编译器警告以捕获诸如运行时将类型为double 的数字转换为类型int32_t 的问题。
显然,在这些转换过程中我总是很担心,因为:
- 数字十进制值丢失
- 可能的正溢出或负溢出(“正溢出”是指双精度值大于 INT32_MAX 并尝试将该值存储在目标类型中(本例中为
int32_t))
每当我担心这样的转换时,我通常会使用单行检查:
boost::numeric_cast<DestType>(SourceType)
但是我想在没有boost 的情况下做同样的事情。
直接的 C++ 是否有等价的 boost::numeric_cast<DestType>(SourceType)?
如果直接的 C++ 没有等价物,那么什么是可比较的非boost 实现?
我认为有点可比的检查基本上是一个模板函数,它有一个 if 语句来检查输入参数的正或负溢出(通过使用 std::numeric_limits<DestType> ::max() 和 ::min() 并引发异常)。
【问题讨论】:
-
不,标准库中没有数字转换。至于非 boost 实现,boost 是开源的,你可以从 boost 中获取实现并按原样使用。
-
当然,如果您确实从 boost 中获取实现并像 @SergeyA 建议的那样使用它,您仍然需要遵守 Boost 使用的开源许可证。
-
@SergeyA 我检查了 Boost 的实现,不幸的是它不像复制头文件那么简单。
标签: c++ templates boost floating-point integer-overflow