Formatting library (since C++20)
文本格式化库为 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)
(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)
|
格式化错误时抛出的异常类型
(类) |
辅助项 (始于 C++23)
|
template
<
class
R,
class
CharT
>
concept
/*const-formattable-range*/
=
|
(1) | ( 仅用于说明* ) |
|
template
<
class
R,
class
CharT
>
using
/*fmt-maybe-const*/
=
|
(2) | ( 仅用于说明* ) |
注释
| 功能测试 宏 | 值 | 标准 | 功能特性 | |
|---|---|---|---|---|
__cpp_lib_format
|
201907L
|
(C++20) | 文本格式化 | |
202106L
|
(C++23)
(DR20) |
编译期格式字符串检查;
减少 std::vformat_to 的参数化 |
||
202110L
|
(C++23)
(DR20) |
修复时间格式化器中的区域设置处理;
支持非常量可格式化类型 |
||
202207L
|
(C++23)
(DR20) |
暴露
std::basic_format_string
;
阐明时间类型本地化格式化中的编码处理 |
||
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++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| P2418R2 | C++20 |
既非常量可格式化亦不可复制的对象
(如生成器类对象)不可格式化 |
允许格式化这些对象
(放宽格式化器要求) |
| P2508R1 | C++20 | 该功能没有对用户可见的名称 |
暴露
basic_format_string
名称
|
参见
|
(C++23)
|
使用参数的
格式化
表示打印到
stdout
或文件流
(函数模板) |
|
(C++23)
|
与
std::print
相同,但每次打印后会附加换行符
(函数模板) |
|
(C++23)
|
输出参数的
格式化
表示
(函数模板) |