添加自定义类型格式,以及所有常用选项
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::<ver>::detail::parse_format_specs
——所以,仍然是私有的。是否有推荐的方法来使用它,或者通过另一种支持的方式来完成它? (谢谢)
主要变化是解析现在与 C++20 std::format 一致,并且可以更好地使用 Unicode,但它还不是公共 API 的一部分。以上是关于添加自定义类型格式,以及所有常用选项的主要内容,如果未能解决你的问题,请参考以下文章