- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在做一堆应用数学/信号处理/算法 C++ 代码。
我已经启用了 -Wconversion
编译器警告捕获类型为 double
的数字的运行时转换等问题输入 int32_t
.
显然,在这些转换过程中我总是很担心,因为:
int32_t
))每当我担心这种转换时,我通常会使用单行检查:
boost::numeric_cast<DestType>(SourceType)
但是我想在没有 boost
的情况下做同样的事情.
直接 C++ 是否有等效的 boost::numeric_cast<DestType>(SourceType)
?
如果直接的 C++ 没有等效项,那么什么是可比较的非 boost
实现?
我认为有点类似的检查基本上是一个模板函数,它有一个 if 语句来检查输入参数是否正溢出或负溢出(通过使用 std::numeric_limits<DestType>
::max()
和 ::min()
并抛出异常).
最佳答案
As @SergeyA stated , 没有标准的 C++ 规范目前没有相当于 Boost 的 boost::numeric_cast<typename Destination>(Source value)
.
这是一个仅使用标准 C++ 的直接实现:
template<typename Dst, typename Src>
inline Dst numeric_cast(Src value)
{
typedef std::numeric_limits<Dst> DstLim;
typedef std::numeric_limits<Src> SrcLim;
const bool positive_overflow_possible = DstLim::max() < SrcLim::max();
const bool negative_overflow_possible =
SrcLim::is_signed
or
(DstLim::lowest() > SrcLim::lowest());
// unsigned <-- unsigned
if((not DstLim::is_signed) and (not SrcLim::is_signed)) {
if(positive_overflow_possible and (value > DstLim::max())) {
throw std::overflow_error(__PRETTY_FUNCTION__ +
std::string(": positive overflow"));
}
}
// unsigned <-- signed
else if((not DstLim::is_signed) and SrcLim::is_signed) {
if(positive_overflow_possible and (value > DstLim::max())) {
throw std::overflow_error(__PRETTY_FUNCTION__ +
std::string(": positive overflow"));
}
else if(negative_overflow_possible and (value < 0)) {
throw std::overflow_error(__PRETTY_FUNCTION__ +
std::string(": negative overflow"));
}
}
// signed <-- unsigned
else if(DstLim::is_signed and (not SrcLim::is_signed)) {
if(positive_overflow_possible and (value > DstLim::max())) {
throw std::overflow_error(__PRETTY_FUNCTION__ +
std::string(": positive overflow"));
}
}
// signed <-- signed
else if(DstLim::is_signed and SrcLim::is_signed) {
if(positive_overflow_possible and (value > DstLim::max())) {
throw std::overflow_error(__PRETTY_FUNCTION__ +
std::string(": positive overflow"));
} else if(negative_overflow_possible and (value < DstLim::lowest())) {
throw std::overflow_error(__PRETTY_FUNCTION__ +
std::string(": negative overflow"));
}
}
// limits have been checked, therefore safe to cast
return static_cast<Dst>(value);
}
注意事项:
std::numeric_limits<float>::min()
但必须使用 std::numeric_limits<Dst>::lowest()
因为::min
返回的是 1e-38 而不是负 float std::numeric_limits
是 const 表达式,因此编译器将能够在编译时极大地简化它(即 N 个 if 语句将在编译时减少为一个 if 语句或没有)关于c++ - c++ 有等效的 boost::numeric_cast<DestType>(SourceType) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49658182/
每当 boost 的 numeric_cast<>转换失败,抛出异常。 boost 中是否有类似的模板让我指定一个默认值,或者在这种情况下捕获异常是我唯一能做的? 我不太担心所有额外异常处理的性能,但
所以我有自己的 uint64_t 到 uint32_t 数字转换策略 struct MyOverflowHandlerPolicy { void operator() ( boost::num
当我想在不同的整数类型之间进行转换时,似乎最好的语法是使用 boost::numeric_cast<>() : int y = 99999; short x = boost::numeric_cast
我们希望在两种数字类型之间进行经过检查的数字转换,而不会在失败时引发异常。像这样的东西: bool numeric_cast(Source s, Target &t) boost 错误处理与生成调用堆
我正在做一堆应用数学/信号处理/算法 C++ 代码。 我已经启用了 -Wconversion编译器警告捕获类型为 double 的数字的运行时转换等问题输入 int32_t . 显然,在这些转换过程中
我是一名优秀的程序员,十分优秀!