Boost C++ 库

……世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

第 18 章。Boost.Lexical_Cast 1.0 - Boost C++ 函数库
PrevUpHomeNext

第 18 章。Boost.Lexical_Cast 1.0

根据 Boost 软件许可证版本 1.0 发布。(参见随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)

有时一个值必须被转换为文字文本形式,例如将一个 int 表示为 std::string,反之亦然,当 std::string 被解释为 int 时。当在程序内部数据类型和程序外部表示(例如窗口和配置文件)之间进行转换时,这种情况很常见。

标准 C 和 C++ 库提供了许多进行此类转换的工具。然而,它们在使用方便性、可扩展性和安全性方面存在差异。

例如,以 atoi 为代表的标准 C 函数系列存在许多限制。

  • 转换仅支持一个方向:从文本到内部数据类型。使用 C 库进行反向转换,要么需要 sprintf 函数的不便和安全性下降,要么需要 itoa 等非标准函数的兼容性损失。
  • 支持的类型范围只是内置数值类型的一个子集,即 intlongdouble
  • 类型范围无法以统一的方式扩展。例如,从字符串表示转换为复数或有理数。

strtol 为代表的标准 C 函数具有相同的基本限制,但提供了对转换过程更精细的控制。然而,对于常见情况,这种控制通常不是必需的,或者不被使用。scanf 函数系列提供了更大的控制,但同样缺乏安全性和易用性。

标准 C++ 库提供了 stringstream 来进行讨论中的核心格式化。它通过文本提供了对 I/O 与任意类型之间格式化和转换的极大控制。然而,对于简单的转换,直接使用 stringstream 可能很笨拙(引入额外的局部变量且丢失了中缀表达式的便利性),或者晦涩难懂(在表达式中创建 stringstream 对象作为临时对象)。Facets 为控制文本表示提供了一个全面的概念和设施,但其感知到的复杂性和高门槛对于简单的转换需要极大的投入,并且将除少数程序员之外的所有人都排除在外。

lexical_cast 函数模板提供了一种方便一致的形式,用于支持当任意类型表示为文本时,与文本之间进行常见转换。它所提供的简化在于表达式级别的便捷性。对于更复杂的转换,例如精度或格式化需要比 lexical_cast 默认行为更严格的控制,建议使用传统的 std::stringstream 方法。对于数值到数值的转换,boost::numeric_cast 可能比 lexical_cast 提供更合理的结果。

有关基于字符串的格式化选项和问题的详细讨论,包括 stringstreamlexical_cast 等的比较,请参阅 Herb Sutter 的文章 The String Formatters of Manor Farm。另外,请查看 性能 部分。


PrevUpHomeNext