版权所有 © 2000-2005 Kevlin Henney
版权所有 © 2006-2010 Alexander Nasonov
版权所有 © 2011-2025 Antony Polukhin
根据 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 函数系列存在许多限制。
sprintf
函数的不便和安全性下降,要么需要 itoa
等非标准函数的兼容性损失。int
、long
和 double
。以 strtol
为代表的标准 C 函数具有相同的基本限制,但提供了对转换过程更精细的控制。然而,对于常见情况,这种控制通常不是必需的,或者不被使用。scanf
函数系列提供了更大的控制,但同样缺乏安全性和易用性。
标准 C++ 库提供了 stringstream
来进行讨论中的核心格式化。它通过文本提供了对 I/O 与任意类型之间格式化和转换的极大控制。然而,对于简单的转换,直接使用 stringstream
可能很笨拙(引入额外的局部变量且丢失了中缀表达式的便利性),或者晦涩难懂(在表达式中创建 stringstream
对象作为临时对象)。Facets 为控制文本表示提供了一个全面的概念和设施,但其感知到的复杂性和高门槛对于简单的转换需要极大的投入,并且将除少数程序员之外的所有人都排除在外。
lexical_cast
函数模板提供了一种方便一致的形式,用于支持当任意类型表示为文本时,与文本之间进行常见转换。它所提供的简化在于表达式级别的便捷性。对于更复杂的转换,例如精度或格式化需要比 lexical_cast
默认行为更严格的控制,建议使用传统的 std::stringstream
方法。对于数值到数值的转换,boost::numeric_cast
可能比 lexical_cast
提供更合理的结果。
有关基于字符串的格式化选项和问题的详细讨论,包括 stringstream
、lexical_cast
等的比较,请参阅 Herb Sutter 的文章 The String Formatters of Manor Farm。另外,请查看 性能 部分。