如何实现C++ std::format对自定义复合对象的递归格式化?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1089个文字,预计阅读时间需要5分钟。
在自定义类内部,可以直接使用`operator`关键字来重载运算符。以下是一个示例,展示了如何在类`Fraction`中重载加法运算符`+`:
关键点:
- 特化必须写在
namespace std { ... }里,不能在全局或你自己的命名空间 - 必须是全特化:
template struct std::formatter<mystruct char> { ... };</mystruct> - 头文件中定义,且确保所有调用
std::format的地方都能看到这个特化(别放在.cpp里) - 如果
MyStruct有私有成员,format()访问不到,要么加friend struct std::formatter<mystruct char>;</mystruct>,要么暴露公有访问接口
parse()里解析格式说明符不能跳过非法字符
parse()不是“尽力而为”,而是“严格守界”。比如你只支持:x和:X,但用户写了{:x8},parse()必须停在'8'处并返回指向它的迭代器;若直接返回ctx.end(),std::format会认为整个说明符合法,后续format()运行时可能崩溃或输出错乱。
本文共计1089个文字,预计阅读时间需要5分钟。
在自定义类内部,可以直接使用`operator`关键字来重载运算符。以下是一个示例,展示了如何在类`Fraction`中重载加法运算符`+`:
关键点:
- 特化必须写在
namespace std { ... }里,不能在全局或你自己的命名空间 - 必须是全特化:
template struct std::formatter<mystruct char> { ... };</mystruct> - 头文件中定义,且确保所有调用
std::format的地方都能看到这个特化(别放在.cpp里) - 如果
MyStruct有私有成员,format()访问不到,要么加friend struct std::formatter<mystruct char>;</mystruct>,要么暴露公有访问接口
parse()里解析格式说明符不能跳过非法字符
parse()不是“尽力而为”,而是“严格守界”。比如你只支持:x和:X,但用户写了{:x8},parse()必须停在'8'处并返回指向它的迭代器;若直接返回ctx.end(),std::format会认为整个说明符合法,后续format()运行时可能崩溃或输出错乱。

