c++ 如何直接使用`std::formatter`?

hgc7kmma  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(114)

假设我想绕过std::format,直接使用std::formatter化一个对象,我该怎么做?
根据Formatter,我需要调用.format(value, format_ctx),其中format_ctxstd::format_contextstd::basic_format_context<...>。但是我如何构造这个上下文呢?
标准似乎没有提供一种构造方法,查看libstdc++源代码,basic_format_context的成员变量都是私有的,没有非默认的构造函数,如果不是friend,就没有办法设置它们。
这是否意味着std::formatter在设计上不可能手动使用?

我为什么要这么做

我想使用“调试格式”("{?:}")来格式化一个值,如果它被支持的话,回到常规的"{}"
检查是否支持的方法似乎是requires(std::formatter<T> f){f.set_debug_format();},我认为如果我已经直接与格式化程序交互,我还不如只使用格式化程序本身。

cpjpxq1n

cpjpxq1n1#

不支持您所描述的用例,即您从未实际调用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。这基本上就是实现范围格式化程序的方式(如果不是标准已经提供了一个的话)。

相关问题