gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:28:06 25 4
gpt4 key购买 nike

我正在尝试创建一个 libfmt formatter对于 std::unordered_map<std::string, Foo>使用 fmt::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

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

最佳答案

这里是固定版本:
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对于键 ( first) 其他不是。

其他修复方法:

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

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

关于c++ 格式无序映射与 fmt::join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71299167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com