使用所有常用选项添加自定义类型格式

Adding custom type formatting, with all the usual options

我制作了十进制 class 并想使用 fmt 库。 我读到为格式化程序定义类型的方法是专门化 fmt::formatter。 但是,文档中没有关于如何调用现有公共基础设施的信息。字段对齐、总宽度和填充字符的格式代码,例如:这应该是适用于任何类型的通用代码。
如何在不从头重新实现整个规范的情况下编写格式化程序专业化?

我想首先使我的类型与浮点格式说明符兼容,因此当类型从 double 更改为十进制时,它将继续以相同的方式工作;然后添加特定于该类型的其他功能。

template <int S, int F>
struct fmt::formatter<Decimal<S,F>> {

constexpr auto parse(format_parse_context& ctx) {
    [[maybe_unused]] auto it = ctx.begin(), end = ctx.end();
    // dummy stub.  just take the whole thing
    it = std::find(ctx.begin(),end, '}');
    return it;
}

template <typename FormatContext>
auto format(const Dec& x, FormatContext& ctx) {
    constexpr size_t bufsize = 64;
    char buf[bufsize];
    const auto end = x.to_chars (buf, buf+bufsize, false);
    const std::string_view sv { buf, size_t(end-buf) };
    return std::copy(sv.begin(),sv.end(),ctx.out());
}
};

{fmt} 尚未提供解析标准格式说明符的功能。它在内部使用 fmt::detail::parse_format_specs。它需要稍微清理一下并移至 public API 以供重复使用。