C++20的std::format库怎么用?C++类型安全的格式化输出【C++20】

发布时间 - 2025-12-26 00:00:00    点击率:
std::format 是 C++20 引入的类型安全、高性能、无副作用格式化库,基于 Python 语法但编译期检查、零运行时解析开销;支持位置参数、格式说明符(如 {:x}、{:.2f})和花括号转义,C++23 起扩展命名参数。

std::format 是 C++20 引入的类型安全、高性能、无副作用的格式化库,替代了传统的 printf 和易出错的 std::ostringstream 拼接。它基于 Python 的 str.format() 语法,但完全编译期检查、零运行时解析开销(多数情况下),且不依赖 C 运行时。

基础用法:格式化成字符串

最常用的是 std::format 函数,返回 std::string

  • 占位符用 {},自动按参数顺序填充
  • 支持类型自动转换(intdoublestd::stringconst char* 等内置/标准类型默认支持)
  • 编译器会在编译期验证参数个数和类型匹配,错写直接报错

例子:

std::string s = std::format("Hello {}, you have {} messages", "Alice", 42);
// 结果:"Hello Alice, you have 42 messages"

格式说明符:对齐、宽度、精度、进制

{} 中加冒号 : 后写格式说明符,类似 Python:

  • {:d} 十进制整数(显式)
  • {:x} 小写十六进制,{:X} 大写
  • {:.2f} 保留两位小数的浮点数
  • {:>10} 右对齐、最小宽度 10
  • {:^8s} 居中、宽 8、字符串截断或补空格
  • {:05d} 补零至 5 位(如 42 → "00042"

例子:

auto s = std::format("0x{:04x}, {:.3f}, {:>6}", 255, 3.14159, "hi");
// "0x00ff, 3.142, hi"

命名参数与位置参数(C++23 扩展,但部分编译器 C++20 已实验支持)

标准 C++20 **只支持位置参数(隐式 0,1,2… 或显式 {0},{1})**,不支持命名如 {name} —— 这是 C++23 的 std::format 新特性。不过你可以安全使用:

  • {0}{1} 显式指定位置(避免歧义,尤其含 { 字符时)
  • 重复引用同一参数:std::format("{0} * {0} = {1}", x, x*x)
  • 转义花括号:写两个 {{}} 表示字面量 {}

例子:

std::format("Price: ${0:.2f} (was ${1:.2f})", sale, original);
std::format("Braces: {{hello}}"); // → "Braces: {hello}"

输出到流:std::print(C++23)?当前用 std::cout

C++20 标准 **没有 std::print** —— 那是 C++23 加入的。目前(C++20)推荐写法是:

  • std::cout
  • 或封装一层(避免重复构造临时 string):
template
void print(Args&&... args) {
  std::cout (args)...);
}

注意:不要用 std::format_to + std::back_inserter 做简单输出,它适合写入预分配 buffer 场景(如日志缓冲区)。

基本上就这些。std::format 安全、简洁、可读性强,取代 sprintf 和手工拼接完全可行。只要编译器支持(GCC 13+、Clang 15+、MSVC 19.32+),打开 -std=c++20 就能用。不复杂但容易忽略细节——比如忘记它不支持命名参数(C++20),或误以为有 std::print


# python  # c++  # stream  # 格式化输出 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel API资源类怎么用_Laravel API Resource数据转换  使用C语言编写圣诞表白程序  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  Python文本处理实践_日志清洗解析【指导】  网站制作报价单模板图片,小松挖机官方网站报价?  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  制作旅游网站html,怎样注册旅游网站?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  如何快速生成专业多端适配建站电话?  java ZXing生成二维码及条码实例分享  如何在自有机房高效搭建专业网站?  如何用已有域名快速搭建网站?  如何在服务器上配置二级域名建站?  如何注册花生壳免费域名并搭建个人网站?  🚀拖拽式CMS建站能否实现高效与个性化并存?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  EditPlus 正则表达式 实战(3)  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Laravel Docker环境搭建教程_Laravel Sail使用指南  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  如何在Windows服务器上快速搭建网站?  香港网站服务器数量如何影响SEO优化效果?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  JS经典正则表达式笔试题汇总  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  C++时间戳转换成日期时间的步骤和示例代码  Linux网络带宽限制_tc配置实践解析【教程】  Laravel如何使用Vite进行前端资源打包?(配置示例)  SQL查询语句优化的实用方法总结  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel怎么在Blade中安全地输出原始HTML内容  Python函数文档自动校验_规范解析【教程】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何用IIS7快速搭建并优化网站站点?  网站制作价目表怎么做,珍爱网婚介费用多少?