Boost C++ 库

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

第 18 章。Boost.Lexical_Cast 1.0

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

目录

动机
示例
字符串到数字的转换
数字到字符串的转换
转换为字符串,无需动态内存分配
转换字符串的一部分
泛型编程 (Boost.Fusion)
泛型编程 (Boost.Variant)
概要
lexical_cast
bad_lexical_cast
try_lexical_convert
常见问题解答
变更
性能
测试描述
GNU C++ 版本 9.4.0
Clang 版本 15.0.7
GNU C++ 版本 10.5.0

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

标准 C 和 C++ 库提供了许多用于执行此类转换的工具。但是,它们在易用性、可扩展性和安全性方面各不相同。

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

  • 转换仅在一个方向上受支持:从文本到内部数据类型。使用 C 库以另一种方式进行转换需要 sprintf 函数的不便和降低的安全性,或者与非标准函数(如 itoa)相关的可移植性损失。
  • 支持的类型范围仅是内置数字类型(即 intlongdouble)的子集。
  • 类型范围无法以统一的方式扩展。例如,从字符串表示形式到 complex 或 rational 的转换。

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 的文章 Manor Farm 的字符串格式化程序。另请查看 性能 部分。


PrevUpHomeNext