秘笈15 将数值转换为数值
你可能还记得自己编写类似下面的代码的情况:

通常情况下,程序员只是将其显式转换为无符号短整数的数据类型来忽略这些警告,如下面的代码片段所示:

但是,这可能会使得它的错误非常难以检测到。这样的错误代码可能存在很多年才被捕获:

准备
这个秘笈只需要有C++基础知识。
做法
1. Boost.NumericConversion库提供了这种情况下的解决方案,并且修改现有的代码来使用安全的转换很简单,只需将static_cast替换为boost::numeric_cast。当源值不能在目标中存储时,它会抛出一个异常。让我们来看下面的例子:

2.现在,如果运行test_function(),它会输出如下内容:

3.甚至可以检测到特定的溢出类型:

test_function1()函数将输出如下内容:

工作原理
它检查输入参数的值是否能在新的类型中容纳,而不会丢失数据,而且如果在转换过程中有些东西丢失了,则抛出一个异常。
Boost.NumericConversion库有一个非常快的实现,它可以在编译时做很多工作。例如,当转换为范围更宽的类型时,源代码将只需要调用static_cast方法。
还有更多
boost::numeric_cast函数是通过boost::numeric::converter实现的,它可以被调整为使用不同的溢出、范围检查和四舍五入策略。但通常情况下,numeric_cast正是你需要的。
下面是一个小例子,演示了如何为boost::numeric::cast制作我们自己的mythrow_overflow_handler处理程序:

输出如下:

它起作用了!不在范围内!
参见
Boost的官方文档中包含了数值转换器所有模板参数的详细说明,可在以下地址查看该文档:http://www.boost.org/doc/libs/1_53_0/libs/numeric/conversion/doc/html/index.html。