第2章 数据转换
我们已经知道了一些基本的Boost类型,现在来了解一些数据转换的函数。在本章中,我们将看到字符串、数值和用户定义类型如何互相转换,如何安全地强制转换多态类型,以及如何在C++源文件里面编写小型和大型解析器。
秘笈13 将字符串转换为数值
在C++中将字符串转换为数值使很多人感到沮丧,因为其效率低下并且用户难于操控它。让我们来看看如何将字符串100转换为int类型:

C方法也好不了多少:

准备
这个秘笈只需要有 C++和STL的基础知识。
做法
Boost中有一个库,其将有助于解决使人郁闷的字符串向数值转换的困难。这个库称为Boost.LexicalCast,它由一个boost:: bad_lexical_cast异常类和少数 boost::lexical_cast函数组成:

它甚至可以被用于非零结尾的字符串:

工作原理
boost::lexical_cast函数接受字符串作为输入,并将其转换成尖括号中指定的类型。boost::lexical_cast函数甚至还会检查边界:

并且检查输入的语法是否正确:

还有更多
词汇强制转换(lexical_cast)就像所有使用std::locale的std::stringstreams类一样,它也使用std::locale,并且能对本地化数值做转换, 还有一系列引人注目的优化,专门针对C locale(语言环境)以及对数值不进行分节的语言环境:

而这还不是全部!你甚至可以简单地创建用于将其他类型转换为数值的模板函数。让我们编写一个函数,将一个包含一些string值的容器转换为long int值的向量:

参见
参考秘笈14中的boost::lexical_cast性能信息。
Boost.LexicalCast的官方文档包含一些例子、性能措施以及常见问题的答案。可从以下地址查看这些资料:http://www.boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast.html。