...one of the most highly regarded and expertly designed C++ library projects in the world.
— Herb Sutter and Andrei Alexandrescu, C++ Coding Standards
版权所有 © 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 复制副本)
目录
有时,一个值必须转换为文字文本形式,例如表示为 std::string
的 int
,反之亦然,当 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 的文章 Manor Farm 的字符串格式化程序。另请查看 性能 部分。