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
およびその他のタイプを作成する最良の方法は何ですか? なぜ私はそれを得るのですか?date
fmt
fmt::to_string()
"{}"
私はまだ C++20 の日付をサポートするコンパイラを使用できません: 私の知る限り、2020 年 6 月の時点で C++20 の std::chrono のカレンダーとタイムゾーンの部分の完全な実装はありません。
更新: カスタムの空の構造体にカスタム フォーマッタを使用しても問題なく動作し、format("{}", s)
とで同じ結果が得られto_string(s)
ます。上記の Godbolt リンクの例を参照してください。date::year_month_day
したがって、どの壊れ方について特別な何かがあるに違いありませんfmt::to_string()
。