我正在做一堆应用数学/信号处理/算法C++代码。
我已经启用了-Wconversion
编译器警告,以捕获诸如double
类型的数字到int32_t
类型的运行时转换之类的问题。
当然,我总是担心这些转换,因为:
- 数字十进制值丢失
- 可能的正或负溢出(“正溢出”是指double的值大于
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()
并抛出异常)。
2条答案
按热度按时间wqnecbli1#
**正如@SergeyA所说,标准C++规范目前没有与Boost的
boost::numeric_cast<typename Destination>(Source value)
等效的规范。下面是一个简单的实现,它只使用标准C++:
字符串
注意事项:
std::numeric_limits<float>::min()
,而必须使用std::numeric_limits<Dst>::lowest()
,因为::min
返回的是1 e-38而不是负浮点值std::numeric_limits
是const表达式,因此编译器将能够在编译时大大简化它(即N个if语句将在编译时减少为一个if语句或没有)jmo0nnb32#
没有直接的模拟,但是你可以用C++20的
std::in_range
很容易地改变量程字符串
还有
std::cmp_*
inintcmp
可以自己做比较。请注意,std::in_range
和std::cmp_*
只允许您检查范围,而不是检查值是否可以在目标类型中表示,例如,像9'007'199'254'740'993
这样的大uint64_t
值可以完全在double
的范围内,但不能完全由double
表示。如果需要,您需要手动检查型