Formatting library (since C++20)
来自 cppreference.cn
文本格式化库提供了一种安全且可扩展的替代方案,以替代 printf 系列函数。它旨在补充现有的 C++ I/O 流库。
目录 |
[编辑] 格式规范
格式规范指定了如何使用不同类型的选项来格式化对象。
基本类型和标准字符串类型的对象格式化使用基本格式规范。其他库组件也可能提供它们自己的格式规范,详情请参见此处。
[编辑] 格式化函数
定义于头文件
<format> | |
(C++20) |
将参数的格式化表示形式存储在新字符串中 (函数模板) |
(C++20) |
通过输出迭代器写出其参数的格式化表示形式 (函数模板) |
(C++20) |
通过输出迭代器写出其参数的格式化表示形式,不超过指定大小 (函数模板) |
(C++20) |
确定存储其参数的格式化表示形式所需的字符数 (函数模板) |
[编辑] 格式字符串
定义于头文件
<format> | |
(C++20)(C++20)(C++20) |
在构造时执行编译时格式字符串检查的类模板 (类模板) |
(C++26) |
创建可直接在面向用户的格式化函数中使用的运行时格式字符串 (函数) |
[编辑] 格式化概念
定义于头文件
<format> | |
(C++23) |
指定类型是可格式化的,即它特化了 std::formatter 并提供成员函数 parse 和 format (概念) |
[编辑] 可扩展性支持和实现细节
定义于头文件
<format> | |
(C++20) |
使用类型擦除参数表示的 std::format 的非模板变体 (函数) |
(C++20) |
使用类型擦除参数表示的 std::format_to 的非模板变体 (函数模板) |
(C++20)(C++20) |
创建一个类型擦除对象,引用所有格式化参数,可转换为 format_args (函数模板) |
(C++20) (deprecated in C++26) |
用户定义格式化器的参数访问接口 (函数模板) |
(C++20) |
为给定类型定义格式化规则 (类模板) |
(C++23) |
类模板,帮助为范围类型实现 std::formatter 特化 (类模板) |
指示参数类型可以高效打印 (变量模板) | |
(C++23) |
指定应如何格式化范围 (枚举) |
(C++23) |
为范围选择合适的 std::range_format (变量模板) |
(C++20) |
类模板,为用户定义的格式化器提供对格式化参数的访问 (类模板) |
(C++20)(C++20)(C++20) |
提供对所有格式化参数的访问的类 (类模板) |
(C++20)(C++20)(C++20) |
格式化状态,包括所有格式化参数和输出迭代器 (类模板) |
(C++20)(C++20)(C++20) |
格式化字符串解析器状态 (类模板) |
(C++20) |
在格式化错误时抛出的异常类型 (类) |
[编辑] 辅助项 (since C++23)
template< class R, class CharT > concept /*const-formattable-range*/ = |
(1) | (仅为演示*) |
template< class R, class CharT > using /*fmt-maybe-const*/ = |
(2) | (仅为演示*) |
[编辑] 注解
特性测试 宏 | 值 | Std | 特性 | |
---|---|---|---|---|
__cpp_lib_format |
201907L |
(C++20) | 文本格式化 | |
202106L |
(C++23) (DR20) |
编译时格式字符串检查; 减少 std::vformat_to 的参数化 | ||
202110L |
(C++23) (DR20) |
修复 chrono 格式化器中的区域设置处理; 支持非 const-formattable 类型 | ||
202207L |
(C++23) (DR20) |
公开 std::basic_format_string; 阐明 chrono 类型的本地化格式化中的编码处理 | ||
202304L |
(C++26) | 格式化指针 | ||
202305L |
(C++26) | 类型检查格式参数 | ||
202306L |
(C++26) | 成员 std::basic_format_arg::visit | ||
202311L |
(C++26) | 运行时格式字符串 | ||
202403L |
(C++26) | 使用 std::println 打印空白行 | ||
202403L |
(C++26) (DR23) |
允许 std::print 的高效实现
| ||
__cpp_lib_format_ranges |
202207L |
(C++23) | 格式化范围 | |
__cpp_lib_format_path |
202403L |
(C++26) | 格式化 std::filesystem::path | |
__cpp_lib_format_uchar |
202311L |
(C++26) | 修复代码单元作为整数的格式化 | |
__cpp_lib_formatters |
202302L |
(C++23) | 格式化 std::thread::id 和 std::stacktrace |
我们有意将添加 std::basic_format_string
(P2508) 视为缺陷报告,因为所有已知的实现都在 C++20 模式下提供这些组件,尽管官方并未如此分类。
[编辑] 示例
运行此代码
#include <cassert> #include <format> int main() { std::string message = std::format("The answer is {}.", 42); assert(message == "The answer is 42."); }
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
P2418R2 | C++20 | 既非 const-formattable 也非 copyable 的对象 (例如类似生成器的对象)不可格式化 |
允许格式化这些对象 (放宽的格式化器要求) |
P2508R1 | C++20 | 此设施没有用户可见的名称 | 名称 basic_format_string 被公开 |
[编辑] 参见
(C++23) |
使用参数的格式化表示形式打印到 stdout 或文件流 (函数模板) |
(C++23) |
与 std::print 相同,但每次打印都以额外的换行符结尾 (函数模板) |
(C++23) |
输出参数的格式化表示形式 (函数模板) |