c++ - fmt with Howard Hinnant 的日期:为什么来自 fmt::to_string 的“{}”?fmt 和日期的最佳实践?
问题描述
TL;DR:我正在为fmt和 Howard Hinnant 的日期库实现自定义格式化程序。有了date::year_month_day d{};
,为什么fmt::to_string(d)
return "{}"
whilefmt::format("{}", d)
工作正常,返回"0000-00-00"
?Godbolt 上的示例。
我正在使用日期库并尝试从 iostreams 切换到fmt。我需要以date::year_month_day
YYYY-MM-DD 格式进行格式化,所以我编写了一个自定义格式化程序(fmt::formatter for 的模板专业化date::year_month_day
):
template<>
struct fmt::formatter<date::year_month_day> {
template<typename ParseContext>
auto parse(ParseContext & ctx) { return ctx.begin(); }
template<typename FormatContext>
auto format(const date::year_month_day & ymd, FormatContext & ctx) -> decltype(ctx.out()) {
const int year = (int)ymd.year();
const unsigned month = (unsigned)ymd.month();
const unsigned day = (unsigned)ymd.day();
return fmt::format_to(ctx.out(), "{:04}-{:02}-{:02}", year, month, day);
}
};
Godbolt 上提供了完整的最小工作示例,其中包含两个工作示例和一个失败示例。
使用该自定义格式化程序,fmt::format("{}", date::year_month_day{})
按预期工作,返回"0000-00-00"
. fmt::to_string(date::year_month_day{})
应该返回相同的结果,但返回"{}"
。
date::year_month_day
格式化和其他类型date
的最佳方式是什么fmt
,包括fmt::to_string()
?为什么我会这样"{}"
?
我还不能使用支持 C++20 日期的编译器:据我所知,截至 2020 年 6 月,C++20 的 std::chrono 的日历和时区部分还没有完整的实现。
更新:对自定义空结构使用自定义格式化程序可以正常工作,对 and 给出相同的结果format("{}", s)
,to_string(s)
请参见上面的 Godbolt 链接上的示例。date::year_month_day
所以肯定有什么特别之处fmt::to_string()
。
解决方案
这是依赖于参数的查找的一个不幸效果:fmt::to_string
调用format
最终被解析为date::format
而不是fmt::format
. 解决方法是完全限定对 in 的调用format
,fmt::to_string
因为它依赖于用户定义的类型。
更新:这已在https://github.com/fmtlib/fmt/commit/2cac8a9d2e36cd920a9a60ec5b776c187e843fbb中修复。
推荐阅读
- css - Svelte“未使用”的 CSS 未编译
- c# - 在 Mac 上的 .NET 交互式运行时无法加载共享库
- amazon-web-services - 如何在本地使用 SAM 以及在部署时重用 AWS 上的层?
- git - 使 `git help` 在当前窗口而不是新的资源管理器窗口中产生输出
- python - 将查询结果分配给变量 - GBQ Python 客户端
- qt - QML 中的定向阴影
- data-annotations - 将 paperjs 转换为 Coco 时消除行
- javascript - 从所有输入类型、选择等中检索值的 Javascript 通用方法
- firebase - 在 Future builder flutter firebase 中初始化 List 的问题:LateInitializationError: Field 'posts' has not been initialized
- c# - 是否可以在不单独管理 Audit_{Entity} 的情况下使用 Audit.Net?