c++使用 fmt::join 格式化无序映射
我正在尝试使用 fmt 为
但我似乎无法让它工作:std::unordered_map
创建一个 libfmt
formatter
: :join
#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
我确信我只是留下一些愚蠢的东西,我现在看不到它。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是固定版本:
https://godbolt.org/z/r6dGfzesz
问题是这样的:
使用 FooPair = std ::pair;
。注意
unordered_map
的文档:std::unordered_map - cppreference.com
所以问题是类型不匹配:一对包含键(
first
)的const
,其他则不包含。所以其他方法来修复它:
https://godbolt.org/z/9KT9j6h1b
更新2024 年 2 月:对于较新版本的
fmt
,还需要进行一项额外更改。formatter
中的format
函数也必须是const
:https://godbolt.org/z/s691r16Tz
Here is fixed version:
https://godbolt.org/z/r6dGfzesz
Problem is this:
using FooPair = std::pair<std::string, Foo>;
.Note documentation of
unordered_map
:std::unordered_map - cppreference.com
So problems is not matching types: one pair contains
const
for key (first
) other is not.So other way to fix it:
https://godbolt.org/z/9KT9j6h1b
Update Feb 2024: With newer versions of
fmt
there is one additional change that is needed. Theformat
function informatter<FooPair>
must also beconst
:https://godbolt.org/z/s691r16Tz
如果不需要格式,可以使用 "fmt::format("{}", fmap)" ,查看 https://github.com/fmtlib/fmt/blob/master/test/ranges-test.cc
if you don't require format, you can use "fmt::format("{}", fmap)" , review the tests from https://github.com/fmtlib/fmt/blob/master/test/ranges-test.cc