假设我想绕过std::format
,直接使用std::formatter
化一个对象,我该怎么做?
根据Formatter,我需要调用.format(value, format_ctx)
,其中format_ctx
是std::format_context
或std::basic_format_context<...>
。但是我如何构造这个上下文呢?
标准似乎没有提供一种构造方法,查看libstdc++源代码,basic_format_context
的成员变量都是私有的,没有非默认的构造函数,如果不是friend
,就没有办法设置它们。
这是否意味着std::formatter
在设计上不可能手动使用?
我为什么要这么做
我想使用“调试格式”("{?:}"
)来格式化一个值,如果它被支持的话,回到常规的"{}"
。
检查是否支持的方法似乎是requires(std::formatter<T> f){f.set_debug_format();}
,我认为如果我已经直接与格式化程序交互,我还不如只使用格式化程序本身。
1条答案
按热度按时间cpjpxq1n1#
不支持您所描述的用例,即您从未实际调用
std::(v)format(_to)
而只是直接使用格式化程序。您应该使用您想要使用的格式字符串(即{}
或{:?}
)调用std::format
。即使你可以绕过
std::format
,你也只是在为自己创造工作。你必须手动调用std::formatter<T>::parse
* 和 *std::formatter<T>:format
(因为前者设置了后者使用的状态)。你必须手动设置std::basic_format_parse_context
和std::basic_format_context
对象的内容,假设它们首先支持。另一方面,一个格式化程序可以调用另一个格式化程序,方法是向下传递库传递给它的
std::basic_format_parse_context
和后来的std::basic_format_context
。这基本上就是实现范围格式化程序的方式(如果不是标准已经提供了一个的话)。