C++20中的std::format
以下是C++20中std::format
的核心用法详解及示例代码,结合官方特性和实际应用场景整理:
一、基础用法
-
自动类型推导
使用{}
作为占位符,自动推导参数类型:#include <format> #include <iostream> int main() { std::string str = std::format("int: {}, char: {}", 42, 'c'); std::cout << str; // 输出:int: 42, char: c }
-
位置参数
支持手动指定参数索引(从0开始),但不可与自动推导混用:std::cout << std::format("{1}比{0}快", "printf", "std::format"); // 输出:std::format比printf快
二、格式控制符
-
数值格式化
通过:
附加格式规则,支持精度、进制等控制:// 浮点数保留3位小数 std::cout << std::format("π≈{0:.3f}", 3.1415926535); // 输出:π≈3.142 // 十六进制输出 std::cout << std::format("255的十六进制:{0:#x}", 255); // 输出:0xff
-
对齐与填充
指定宽度、对齐方式和填充字符:// 右对齐,宽度10,用*填充 std::cout << std::format("{:*>10}", 42); // 输出:42 // 居中对齐,宽度8 std::cout << std::format("{:^8}", "C++20"); // 输出: C++20
三、高级功能
-
运行时动态格式字符串
使用std::vformat
处理运行时生成的格式字符串:std::string fmt = "动态参数:{1}, {0}"; auto args = std::make_format_args(3.14, "Pi"); std::string str = std::vformat(fmt, args); // 输出:动态参数:Pi, 3.14
-
输出到迭代器
避免内存拷贝,直接写入容器:std::vector<char> buffer; std::format_to(std::back_inserter(buffer), "缓冲区写入:{}", 100);
-
自定义类型支持
通过特化std::formatter
扩展自定义类型:struct Point { int x, y; }; template <> struct std::formatter<Point> { auto parse(auto& ctx) { return ctx.begin(); } auto format(const Point& p, auto& ctx) { return std::format_to(ctx.out(), "({}, {})", p.x, p.y); } }; std::cout << std::format("坐标:{}", Point{3, 5}); // 输出:坐标:(3, 5)
四、性能优势
std::format
相比传统方法(如printf
):
- 类型安全:编译时检查参数类型,避免运行时崩溃 。
- 高效实现:浮点格式化速度可达
snprintf
的10倍以上 。
五、编译要求
需启用C++20标准并包含头文件<format>
:
GCC/Clang编译命令示例
g++ -std=c++20 -O2 main.cpp