fmt::join 的 c++ 格式无序映射
c++ format unordered map with fmt::join
我正在尝试使用 fmt::join
为 std::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>;
我正在尝试使用 fmt::join
为 std::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>;