使用 fmt 库,您可以轻松格式化定义了
operator<<
的类型。 正如在这里解释的那样,您只需添加一行代码即可扩展 ostream_formatter
:
template <> struct fmt::formatter<Foo> : ostream_formatter {};
现在你可以这样做:
fmt::format("Foo is {}", Foo());
通过 std::format()
可以实现类似的事情吗?我有一些已经定义了operator<<
的类型,因此我想开始使用它们与std::format()
一起。
如果我尝试编写自己的格式化程序,我不知道如何从format()
成员函数中的参数中获取ostream
。
template <typename T>
struct ostream_formatter : std::formatter<T> {
constexpr auto parse(std::format_parse_context& ctx) {
return ctx.begin();
}
auto format(const T& obj, auto& ctx) const {
ostream out = ???;
out << obj;
...
}
};
直接编写格式化程序是否比依赖operator<<
更好?
std::stream_buf
,并从上下文中向迭代器编写数据。 - Alan Birtlesfmtlib
的实现,尽管它使用了一些标准库中没有的东西(例如basic_memory_buffer
)。如果你不担心性能问题,我想你可以简单地使用 stringstream 然后返回std::format("{}", ss.str())
。 - Holtss.str()
ж—¶пјҢдҪҝз”Ёstd::format("{}", ss.str())
жІЎжңүд»»дҪ•ж„Ҹд№үгҖӮ - Remy Lebeau