fmt::join 的 c++ 格式无序映射

c++ format unordered map with fmt::join

我正在尝试使用 fmt::joinstd::unordered_map<std::string, Foo> 创建 libfmt formatter,但我似乎无法让它工作:

#include <fmt/core.h>
#include <fmt/format.h>
#include <unordered_map>

struct Foo{
  int a;
};

using FooPair = std::pair<std::string, Foo>;
using FooMap = std::unordered_map<std::string, Foo>;


namespace fmt{

template <>
struct formatter<Foo> {
  template <typename ParseContext>
  constexpr auto parse(ParseContext& ctx) {
    return ctx.begin();
  }

  template <typename FormatContext>
  auto format(const Foo& f, FormatContext& ctx) {
    return format_to(ctx.out(), "\n    {}", f.a);
  }
};

template <>
struct formatter<FooPair> {
  template <typename ParseContext>
  constexpr auto parse(ParseContext& ctx) {
    return ctx.begin();
  }

  template <typename FormatContext>
  auto format(const FooPair& fp, FormatContext& ctx) {
    return format_to(ctx.out(), "\n  {}{}", fp.first, fp.second);
  }
};


template <>
struct formatter<FooMap> {
  template <typename ParseContext>
  constexpr auto parse(ParseContext& ctx) {
    return ctx.begin();
  }

  template <typename FormatContext>
  auto format(const FooMap& fm, FormatContext& ctx) {
    return format_to(ctx.out(), "{}", fmt::join(fm.begin(), fm.end(), ""));
  }
};


}




int main(){


FooMap foomap;

fmt::print("Foo Map: {}", foomap);

}

看起来我缺少一个迭代器的格式化程序,但我尝试定义它以及一个 const_iterator 无济于事。这里的最小示例:https://godbolt.org/z/q4615csG6

我确定我只是遗漏了一些愚蠢的东西,我现在看不到它。

这里是固定版本:
https://godbolt.org/z/r6dGfzesz

using FooMap = std::unordered_map<std::string, Foo>;
using FooPair = FooMap::value_type;

问题是这样的:using FooPair = std::pair<std::string, Foo>;。 注意 unordered_map 的文档:
std::unordered_map - cppreference.com

value_type std::pair<const Key, T>

所以问题是不匹配类型:一对包含 const for key (first) 其他不是。

其他修复方法:

using FooPair = std::pair<const std::string, Foo>;

https://godbolt.org/z/9KT9j6h1b