添加自定义类型格式,以及所有常用选项

Posted

技术标签:

【中文标题】添加自定义类型格式,以及所有常用选项【英文标题】:Adding custom type formatting, with all the usual options 【发布时间】:2020-03-30 15:57:18 【问题描述】:

我创建了一个 Decimal 类并想使用 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());

;

【问题讨论】:

我阅读示例和文档的方式是,您应该只输出完整的数据,让格式化库担心字段宽度、对齐方式和其他类似的事情。 不,用我的自定义类型尝试:^*30 没有任何作用。它准确地打印出我输入输出迭代器的内容。 【参考方案1】:

fmt 还没有提供解析标准格式说明符的工具。它在内部使用fmt::detail::parse_format_specs。它需要稍微清理一下并移至公共 API 以供重用。

【讨论】:

一年后有什么更新吗?我注意到它现在被称为fmt::&lt;ver&gt;::detail::parse_format_specs——所以,仍然是私有的。是否有推荐的方法来使用它,或者通过另一种支持的方式来完成它? (谢谢) 主要变化是解析现在与 C++20 std::format 一致,并且可以更好地使用 Unicode,但它还不是公共 API 的一部分。

以上是关于添加自定义类型格式,以及所有常用选项的主要内容,如果未能解决你的问题,请参考以下文章

类型转换

为字符串格式添加自定义转换类型

使用 java 应用程序安装添加自定义文件类型

带有外部模板的自定义类型 fmt 格式化程序,有啥缺点吗?

使用自定义帖子类型的标题列表作为 ACF 字段的值

Wordpress ACF 字段如何从自定义帖子类型中获取选项