14|Formatting:千呼万唤始出来的新format标准
复杂的文本格式化方案
- 深入了解
- 翻译
- 解释
- 总结
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归属地:广东