1

TL;DR: fmtと Howard Hinnant の日付ライブラリ用のカスタム フォーマッタを実装しています。では、正常に動作しているときにreturnが返さdate::year_month_day d{};れるのはなぜですか? ゴッドボルトの例fmt::to_string(d)"{}"fmt::format("{}", d)"0000-00-00"


日付ライブラリを使用していて、iostreams からfmtに切り替えようとしています。YYYY-MM-DD 形式でフォーマットする必要があるdate::year_month_dayため、カスタム フォーマッタを作成しました (fmt::formatter のテンプレート特殊化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では、2 つの動作例と 1 つの失敗例を含む完全な最小限の動作例を利用できます。

そのカスタム フォーマッタを使用するとfmt::format("{}", date::year_month_day{})、期待どおりに動作し、"0000-00-00". fmt::to_string(date::year_month_day{})同じ結果を返すはずですが、"{}"代わりに返されます。

を含む を使用してフォーマットdate::year_month_dayおよびその他のタイプを作成する最良の方法は何ですか? なぜ私はそれを得るのですか?datefmtfmt::to_string()"{}"

私はまだ C++20 の日付をサポートするコンパイラを使用できません: 私の知る限り、2020 年 6 月の時点で C++20 の std::chrono のカレンダーとタイムゾーンの部分の完全な実装はありません。

更新: カスタムの空の構造体にカスタム フォーマッタを使用しても問題なく動作し、format("{}", s)とで同じ結果が得られto_string(s)ます。上記の Godbolt リンクの例を参照してください。date::year_month_dayしたがって、どの壊れ方について特別な何かがあるに違いありませんfmt::to_string()

4

1 に答える 1