现代 C++20 实战高手课
卢誉声
Autodesk 首席工程师
3781 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
现代 C++20 实战高手课
15
15
1.0x
00:00/00:00
登录|注册

14|Formatting:千呼万唤始出来的新format标准

你好,我是卢誉声。
在 C++ 中,我们经常讨论一个看似简单的问题——如何实现格式化字符串和格式化输出?
这个问题核心在于字符串格式化,考虑到 C++ 向下兼容的问题,想做出一个能让大家满意的字符串格式化标准方案,其实并不容易。在过去的标准中,C++ 标准委员会一直通过各种修修补补,尝试提供一些格式化的辅助方案,但始终没有一个风格一致的标准化方案。
好在 C++20 及其后续演进中,终于出现了满足我们要求的格式化方案。因此,在这一讲中,我们就聚焦于讲解这个新的字符串格式化方案。
好,话不多说,就让我们开始今天的内容吧 (课程配套代码可以从这里获取)。

复杂的文本格式化方案

首先,我们要弄明白什么是“文本格式化”。
下面一个常见的 HTTP 服务的日志输出,我们结合这个典型例子来讲解。
www | [2023-01-16T19:04:19] [INFO] 127.0.0.1 - "GET /api/v1/info HTTP/1.0" 200 6934 "http://127.0.0.1/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0"
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

C++20标准引入了Formatting库,为C++语言提供了现代化的文本格式化方案。该库提供了类似于其他现代编程语言的文本格式化接口,设计足够完美、便于使用,并提供了足够灵活的框架。通过format函数,开发者可以轻松地对其进行扩展,支持更多的数据类型与格式。除了基本的format参数外,C++20还提供了三个有用的工具函数,分别是format_to、format_to_n和formatted_size,它们提供了更多灵活的输出方式。Formatting库的引入填补了C++20之前文本格式化方案的不足,为开发者提供了更加便捷、安全的文本格式化解决方案。 在了解了Formatting的基本用法后,我们有必要深入Formatting的细节,了解如何基于Formatting库进行扩展,来满足复杂业务需求。Formatting库的核心是formatter类,对于所有希望使用format进行格式化的参数类型来说,都需要按照约定实现formatter类的特化版本。C++20为基础类型与string类型定义了标准的formatter,同时也支持开发者对formatter进行特化,实现自定义的格式化输出。通过重载format函数,开发者可以实现输出自己想要的格式化文本,而通过重载parse函数,可以实现自定义格式化文本解析。 总的来说,C++20的Formatting库为开发者提供了现代化、灵活的文本格式化解决方案,填补了之前C++20文本格式化方案的不足,解决了类型安全、缓冲区溢出、线程安全等问题。开发者可以通过该库实现自定义的格式化输出,满足复杂业务需求。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++20 实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 李云龙
    请教老师一个问题,下面的代码编译不过,报错信息是无法推导 std::formatter的模版参数,这是什么原因呢? #include <format> #include <iostream> // 非模板类 struct Box1 { bool bool_value; int int_value; const char* str; }; template <typename _CharT> struct std::formatter<Box1, _CharT> : std::formatter<bool, _CharT> { template <typename _FormatContext> typename _FormatContext::iterator format(const Box1& v, _FormatContext& format_context) { typename _FormatContext::iterator Ite = std::formatter<bool, _CharT>::format(v.bool_value, format_context); return Ite; } }; int main() { Box1 box1{ .bool_value = false, .int_value = 1, .str = "box1" }; std::cout << std::format("box1 = {}", box1); return 0; }

    作者回复: 可以在Visual Studio 2022中编译通过 需要你提供一下具体的编译器类型和版本,我这里看一下相应的兼容性

    2024-01-15归属地:北京
    4
  • 常振华
    说实话,越改约难用,C++越走越偏了。。。

    作者回复: C++在设计之初缺乏像现代编程语言那样的便捷工具,比如字符串格式化处理。这些工具在新标准下逐渐补完,也算是对现代潮流的一种跟进。同时,相较于使用各种第三方库或自己造轮子,使用标准下的工具更有利于跨平台兼容和系统移植。从这个角度上来说,补充这些工具是存在其意义的。

    2023-10-23归属地:广东
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部