c++ - fmt和Howard Hinnant的日期:为什么从fmt::to_string “{}”? fmt和日期的最佳做法?

标签 c++ date chrono fmt

TL; DR:我正在为fmt和Howard Hinnant的date库实现自定义格式化程序。使用date::year_month_day d{};,为什么fmt::to_string(d)返回"{}"fmt::format("{}", d)可以正常工作,返回"0000-00-00"呢? Example on godbolt

我正在使用date库,并尝试从iostream切换到fmt。我需要将YYt_code格式化为YYYY-MM-DD格式,所以我写了一个自定义格式化程序(date::year_month_day的fmt::formatter模板专用化):

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);
    }
};

完整的最低限度的工作示例是available on godbolt,其中有两个工作示例而一个失败。

使用该自定义格式化程序,date::year_month_day可以按预期工作,并返回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的日历和时区部分的完整实现。

更新:对自定义的空结构使用自定义格式化程序可以很好地工作,为"{}"format("{}", s)提供相同的结果,请参见上面的godbolt链接上的示例。因此,to_string(s)必须有一些特殊之处,可以打破date::year_month_day

最佳答案

这是依赖于参数的查找的不幸结果:fmt::to_string调用format,最终将其解析为date::format而不是fmt::format。解决方法是完全限定对format中的fmt::to_string的调用,因为它取决于用户定义的类型。
更新:此问题已在https://github.com/fmtlib/fmt/commit/2cac8a9d2e36cd920a9a60ec5b776c187e843fbb中修复。

关于c++ - fmt和Howard Hinnant的日期:为什么从fmt::to_string “{}”? fmt和日期的最佳做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62423981/

相关文章:

c++ - cublasSdot 的工作速度比 cublasSgemm 慢

c++ - 为 QRectF 设置 topLeft 和 bottomRight

c++ - 将工作的 x64 解决方案转换为 x86 (VS2017)

c++ - 编辑 QTreeWidgetItem 同时保留文件扩展名

rust - 如何在Rust中将本地时区从UTC转换为UTC

javascript - 我应该使用什么正则表达式来匹配这个日期模式 : DAY. month.YEAR?

javascript - 在 JavaScript 中反转 Date.toLocaleString 转换的 native 方法?

java - 如何在java中将1900年12月25日星期二转换为MM/dd/yyyy格式

c++ - 我可以重新定位 chrono 类以使用微 Controller 作为滴答生成器吗?

c++ - 如何以 “Safe ”的方式获取C++中的当前时间