如何直接使用 std::formatter ?

Hol*_*Cat 12 c++ fmt stdformat

假设我想std::formatter绕过直接使用 来格式化单个对象std::format。我怎么做?

根据Formatter,我需要调用.format(value, format_ctx),其中format_ctxstd::format_contextor std::basic_format_context<...>。但我如何构建这个上下文呢?

该标准似乎没有提供一种构建方法。查看libstdc++ 源代码, 的成员变量basic_format_context都是私有的,没有非默认构造函数,并且如果不是friend.

这是否意味着std::formatter不可能按设计手动使用?


我为什么要这样做?

我想使用“调试格式”( "{?:}") 来格式化一个值(如果支持的话),回退到常规"{}".

检查支持的方法似乎是requires(std::formatter<T> f){f.set_debug_format();},我想如果我已经直接与格式化程序交互,我不妨只使用格式化程序本身。

Bri*_*ian 6

std::(v)format(_to)不支持您所描述的用例,即您从未实际调用而只是直接使用格式化程序。您应该只std::format使用您想要使用的格式字符串进行调用,即{}{:?}

即使你可以绕过std::format,你也只是在为自己创造工作。您必须手动调用std::formatter<T>::parse std::formatter<T>:format(因为前者设置后者使用的状态)。并且您必须手动设置std::basic_format_parse_contextstd::basic_format_context对象的内容,假设它们首先支持该内容。

另一方面,格式化程序可以通过传递库传递给它的std::basic_format_parse_context和稍后的 来调用另一个格式化程序。std::basic_format_context这基本上就是实现范围格式化程序的方式(如果不是因为标准已经提供了一个)。