fmt可隐式格式化自定义Snowflake类但无法格式化其vector容器问题求解
问题解决方法
根因说明
fmt 核心库默认不提供标准容器的格式化支持,即使容器内的元素类型本身支持格式化,也无法直接对容器整体进行fmt输出,和你是否特化了Snowflake的格式化器无关。
最简实现方案
不需要单独为std::vector<Snowflake>特化fmt::formatter,只需要额外引入 fmt 的 ranges 扩展头文件即可:
// 在引入fmt核心头文件后添加这行引入即可 #include <fmt/ranges.h>
引入该头文件后,fmt 会自动支持所有元素可格式化的STL范围类型(包括std::vector、std::array、std::list等),默认输出格式为[元素1, 元素2, 元素3],完全符合你的使用需求。
可选:自定义容器输出格式
如果你需要修改std::vector<Snowflake>的输出格式,再进行特化即可,示例代码如下:
template <> struct fmt::formatter<std::vector<Snowflake>> { constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); } template <typename FormatContext> auto format(const std::vector<Snowflake>& vec, FormatContext& ctx) { auto out = ctx.out(); fmt::format_to(out, "Snowflake列表["); for (size_t i = 0; i < vec.size(); ++i) { if (i > 0) fmt::format_to(out, ", "); fmt::format_to(out, "{}", static_cast<uint64_t>(vec[i])); } return fmt::format_to(out, "]"); } };
内容的提问来源于stack exchange,提问作者Aido
相关产品推荐
相关产品推荐

