如何用fmt库自定义格式化pair向量以生成指定格式输出?
实现用fmt::join格式化std::pair向量为指定格式
直接使用fmt::format("{}", fmt::join(myVec, "|"))无法得到目标输出,因为fmt库默认没有提供std::pair<int, std::string>的格式化规则。以下是两种可行的实现方式:
方法一:自定义fmt格式化器特化
通过特化fmt::formatter模板,告诉fmt库如何将std::pair格式化为"key=value"的形式,之后fmt::join就能自动处理每个元素并拼接:
#include <fmt/format.h> #include <fmt/ranges.h> #include <vector> #include <utility> // 为std::pair<int, std::string>特化格式化器 template <> struct fmt::formatter<std::pair<int, std::string>> { constexpr auto parse(fmt::format_context::parse_context& ctx) { return ctx.begin(); // 使用默认解析逻辑 } template <typename FormatContext> auto format(const std::pair<int, std::string>& p, FormatContext& ctx) { // 定义pair的格式化规则:"first=second" return fmt::format_to(ctx.out(), "{}={}", p.first, p.second); } }; int main() { std::vector<std::pair<int, std::string>> myVec; myVec.emplace_back(12,"A"); myVec.emplace_back(13,"B"); myVec.emplace_back(14,"C"); std::string result = fmt::format("{}", fmt::join(myVec, "|")); fmt::print("{}\n", result); // 输出:12=A|13=B|14=C return 0; }
这种方式适合需要在多个场景格式化同类型pair的情况,一次定义即可全局复用。
方法二:使用临时格式化逻辑(无需全局特化)
如果不想修改全局格式化规则,可以在fmt::join中直接传入lambda表达式,对每个pair做临时格式化:
#include <fmt/format.h> #include <fmt/ranges.h> #include <vector> #include <utility> int main() { std::vector<std::pair<int, std::string>> myVec; myVec.emplace_back(12,"A"); myVec.emplace_back(13,"B"); myVec.emplace_back(14,"C"); std::string result = fmt::format("{}", fmt::join(myVec, "|", [](const auto& p) { return fmt::format("{}={}", p.first, p.second); })); fmt::print("{}\n", result); // 输出:12=A|13=B|14=C return 0; }
对于fmt 9.0及以上版本,还可以使用更简洁的范围格式化语法,直接通过格式说明符指定拼接规则:
std::string result = fmt::format("{:join(|, {}={})}", myVec);
这种方式更适合单次使用的场景,代码更紧凑。
内容的提问来源于stack exchange,提问作者user1658476
相关产品推荐
相关产品推荐

