格式化库 (C++20)

来自cppreference.com
< cpp‎ | utility
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
格式化库
格式化函数
(C++20)
(C++20)
(C++20)
(C++20)
格式化概念
格式化器
(C++20)
格式化参数
(C++20) (C++26 中弃用)
格式错误
 

文本格式化库提供 printf 函数族的安全且可扩展的替用品。有意使之补充既存的 C++ I/O 流库并复用其基础设施。

格式化函数

(C++20)
在新 string 中存储参数的格式化表示
(函数模板)
(C++20)
通过输出迭代器写其参数的格式化表示
(函数模板)
通过输出迭代器写其参数的格式化表示,不超出指定的大小
(函数模板)
确定存储其参数的格式化表示所需的字符数
(函数模板)

格式化概念

在标头 <format> 定义
指示一个类型为可格式化,因此,它需要特化了 std::formatter 并且提供成员函数 parseformat
(概念)

扩展性支持与实现细节

在标头 <format> 定义
(C++20)
std::format 的使用类型擦除的参数表示的非模板变体
(函数)
std::format_to 的使用类型擦除的参数表示的非模板变体
(函数模板)
创建引用所有格式化参数的类型擦除对象,可转换到 format_args
(函数模板)
(C++20) (C++26 中弃用)
用户定义格式化器的参数观览接口
(函数模板)
(C++20)
定义给定类型的格式化规则的类模板
(类模板)
用于帮助实现 std::formatter 对范围类型的特化的类模板
(类模板)
指示一个范围应该如何被格式化
(枚举)
为范围选择合适的 std::range_format
(变量模板)
提供对用户定义格式化器的格式化参数的访问的类模板
(类模板)
提供对所有格式化参数的访问的类
(类模板)
在构造时执行编译期格式字符串检查的类模板
(类模板)
格式化状态,包括所有格式化参数和输出迭代器
(类模板)
格式化字符串分析器状态
(类模板)
格式化错误时抛出的异常类型
(类)

注解

功能特性测试 标准 注释
__cpp_lib_format 201907L (C++20) 格式化文字
202106L (C++20) 编译期格式串检查
减少 std::vformat_to 的特化
202110L (C++20) 修复 chrono formatters 中的本地化处理;
支持非 const 可格式化类型
202207L (C++23) 暴露 std::basic_format_string
澄清 chrono 类型的本地化编码处理
202304L (C++26) 格式化指针
202305L (C++26) 对格式化参数进行类型检查
202306L (C++26) std::basic_format_arg::visit
__cpp_lib_format_ranges 202207L (C++23) 格式化范围

我们有意处理 std::basic_format_stringP2508)为缺陷报告,因为所有已知的实现都使这些组件在 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 既不可 const 格式化又不可复制的对象(例如 generator 式的对象)不可格式化 允许格式化这些对象(放松格式化器要求)
P2508R1 C++20 这个设施没有用户可见的名字 暴露出 basic_format_string 的名字