
C++20 引入了 std::format,这是一个现代化、类型安全且高效的格式化库,用于替代传统的 printf 和繁琐的 std::ostringstream 操作。它借鉴了 Python 的字符串格式化语法,使用起来更直观、更安全。
启用 std::format
注意:你需要编译器和标准库支持 C++20 并正确配置才能使用。- 编译器要求:
- GCC 13+(早期版本需开启实验性支持)
- Clang 14+(配合 libc++)
- MSVC 19.30+(Visual Studio 2022 17.0+)
- 包含头文件:
#include - 编译选项示例(GCC/Clang):
g++ -std=c++20 -fconcepts -O2 main.cpp
基本用法:std::format 和 std::print
std::format 返回一个格式化后的字符串,而 std::print 直接输出到控制台(C++23 才正式加入,目前部分实现可用)。
立即学习“C++免费学习笔记(深入)”;
示例:基本格式化
#include
#include
int main() {
std::string name = "Alice";
int age = 30;
double height = 1.68;
std::string msg = std::format("姓名: {}, 年龄: {}, 身高: {:.2f}m", name, age, height);
std::cout << msg << std::endl;
// 输出: 姓名: Alice, 年龄: 30, 身高: 1.68m
}
格式化语法详解
占位符使用 {},可指定参数索引、类型、宽度、精度、填充等。
-
自动顺序:
std::format("{}, {}, {}", a, b, c) -
指定索引:
std::format("{1}, {0}", "world", "hello") → "hello, world" -
命名参数(暂不支持):C++20 不支持如
{name}这样的命名参数
格式说明符结构:{[index]:[fill][align][width][.precision][type]}
常见格式类型
-
整数:
-
{:d}十进制 -
{:x}小写十六进制 -
{:X}大写十六进制 -
{:o}八进制 -
{:b}二进制
-
-
浮点数:
-
{:.2f}保留两位小数 -
{:.3e}科学计数法 -
{:.0f}不显示小数部分
-
-
对齐与填充:
-
{:8}右对齐,宽度为8 {: 左对齐-
{:^8}居中 -
{:0>5}左补0,右对齐 -
{:*>5}用 * 填充
-
示例:格式控制
std::cout << std::format("|{:>8}|{:<8}|{:^8}|\n", "left", "right", "center");
// | left|right&&&| center |
std::cout << std::format("{:08x}", 255) << "\n"; // 000000ff
std::cout << std::format("{:.2f}", 3.14159) << "\n"; // 3.14
自定义类型格式化
要让自定义类型支持 std::format,需特化 std::formatter。
示例:格式化日期结构
struct Point {
double x, y;
};
template<>
struct std::formatter {
constexpr auto parse(auto& ctx) {
return ctx.begin();
}
auto format(const Point& p, auto& ctx) const {
return std::format_to(ctx.out(), "({:.2f}, {:.2f})", p.x, p.y);
}
};
// 使用
Point p{1.234, 5.678};
std::cout << std::format("点坐标: {}", p) << "\n";
// 输出: 点坐标: (1.23, 5.68)
parse 方法处理格式字符串(如支持 .2f),format 方法执行实际格式化。
基本上就这些。std::format 让 C++ 字符串格式化变得更简洁、更安全。虽然当前工具链支持还在完善中,但它是未来标准方式,值得尽早掌握。











