当前位置: 首页 > article >正文

C++20中的std::format

以下是C++20中std::format的核心用法详解及示例代码,结合官方特性和实际应用场景整理:


一、基础用法

  1. 自动类型推导
    使用{}作为占位符,自动推导参数类型:

    #include <format>
    #include <iostream>
    
    int main() {
        std::string str = std::format("int: {}, char: {}", 42, 'c');
        std::cout << str; // 输出:int: 42, char: c
    }
    
  2. 位置参数
    支持手动指定参数索引(从0开始),但不可与自动推导混用:

    std::cout << std::format("{1}比{0}快", "printf", "std::format");
    // 输出:std::format比printf快
    

二、格式控制符

  1. 数值格式化
    通过:附加格式规则,支持精度、进制等控制:

    // 浮点数保留3位小数
    std::cout << std::format("π≈{0:.3f}", 3.1415926535); // 输出:π≈3.142
    
    // 十六进制输出
    std::cout << std::format("255的十六进制:{0:#x}", 255); // 输出:0xff
    
  2. 对齐与填充
    指定宽度、对齐方式和填充字符:

    // 右对齐,宽度10,用*填充
    std::cout << std::format("{:*>10}", 42); // 输出:42
    
    // 居中对齐,宽度8
    std::cout << std::format("{:^8}", "C++20"); // 输出: C++20  
    

三、高级功能

  1. 运行时动态格式字符串
    使用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
    
  2. 输出到迭代器
    避免内存拷贝,直接写入容器:

    std::vector<char> buffer;
    std::format_to(std::back_inserter(buffer), "缓冲区写入:{}", 100);
    
  3. 自定义类型支持
    通过特化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

http://www.kler.cn/a/571290.html

相关文章:

  • Python-测试代码
  • 利用Adobe Acrobat 实现PPT中图片分辨率的提升
  • 4G工业路由器在公交充电桩中的应用与优势
  • Android U 分屏——SystemUI侧处理
  • 蓝桥杯---归并排序2(leetcode170)题解
  • 石基大商:OceanBase + Flink CDC,搭建连锁零售系统数据湖
  • CentOS7 安装Redis 6.2.6 详细教程
  • 队列的顺序结构—循环队列的判断条件(rear + 1) % MAXSIZE分析
  • flowable的使用
  • 使用Windbg分析dump文件定位软件异常的方法与操作步骤
  • 【Python 数据结构 5.栈】
  • day51 shell
  • 交叉编译 ARM 架构浏览器(补充)
  • 某金融租赁公司数据治理实践
  • R JSON 文件
  • Geotools中获取Shapefile的属性表格字符集编码的一种方法
  • VS2015 c++和cmake配置编程
  • 蓝桥杯复盘记录004(2023)
  • 19.8、C++11新特性有哪些⑧【基于范围的for循环】
  • 深入探索像ChatGPT这样的大语言模型-03-POST-Training:Reinforcement Learning