最終更新日時(UTC):
が更新

履歴 編集

<chrono>

std::chrono::zoned_time::推論補助(C++20)

namespace std::chrono {
  zoned_time() -> zoned_time<seconds>;                          // (1) C++20

  template <class Duration>
  zoned_time(sys_time<Duration>)
    -> zoned_time<common_type_t<Duration, seconds>>;            // (2) C++20

  // 説明用の型
  template <class TimeZonePtrOrName>
  using time-zone-representation =
    conditional_t<is_convertible_v<TimeZonePtrOrName, string_view>,
                  const time_zone*,
                  remove_cvref_t<TimeZonePtrOrName>>;

  template <class TimeZonePtrOrName>
  zoned_time(TimeZonePtrOrName&&)
    -> zoned_time<seconds,
                  time-zone-representation<TimeZonePtrOrName>>; // (3) C++20

  template <class TimeZonePtrOrName, class Duration>
  zoned_time(TimeZonePtrOrName&&,
            sys_time<Duration>)
    -> zoned_time<common_type_t<Duration, seconds>,
                  time-zone-representation<TimeZonePtrOrName>>; // (4) C++20

  template <class TimeZonePtrOrName, class Duration>
  zoned_time(TimeZonePtrOrName&&,
             local_time<Duration>,
             choose = choose::earliest)
    -> zoned_time<common_type_t<Duration, seconds>,
                  time-zone-representation<TimeZonePtrOrName>>; // (5) C++20

  template <class TimeZonePtrOrName, class Duration>
  zoned_time(TimeZonePtrOrName&&,
             zoned_time<Duration>,
             choose = choose::earliest)
    -> zoned_time<common_type_t<Duration, seconds>,
                  time-zone-representation<TimeZonePtrOrName>>; // (6) C++20
}

概要

std::chrono::zoned_timeクラステンプレートの型推論補助。

  • (1) : デフォルトコンストラクタ。秒単位の時間間隔を使用する
  • (2) : sys_time<Duration>からの推論。Durationsecondsの共通の時間間隔を使用する
  • (3) : 任意のタイムゾーンオブジェクトへのポインタ型もしくはタイムゾーン名の文字列型からの推論
    • 時間間隔としてsecondsをもつ
    • タイムゾーンへのポインタ型として、渡された型が文字列であればconst time_zone*、そうでなければCV参照修飾を外したパラメータ型をもつ
  • (4) : 任意のタイムゾーンオブジェクトへのポインタ型もしくはタイムゾーン名の文字列型と、sys_time<Duration>からの推論
    • 時間間隔としてDurationsecondsの共通の型をもつ
    • タイムゾーンへのポインタ型として、渡された型が文字列であればconst time_zone*、そうでなければCV参照修飾を外したパラメータ型をもつ
  • (5) : 任意のタイムゾーンオブジェクトへのポインタ型もしくはタイムゾーン名の文字列型と、local_time<Duration>choose型からの推論
    • 時間間隔としてDurationsecondsの共通の型をもつ
    • タイムゾーンへのポインタ型として、渡された型が文字列であればconst time_zone*、そうでなければCV参照修飾を外したパラメータ型をもつ
  • (6) : 任意のタイムゾーンオブジェクトへのポインタ型もしくはタイムゾーン名の文字列型、zoned_time<Duration>choose型からの推論
    • 時間間隔として、Durationsecondsの共通の型をもつ
    • タイムゾーンへのポインタ型として、渡された型が文字列であればconst time_zone*、そうでなければCV参照修飾を外したパラメータ型をもつ

備考

#include <cassert>
#include <chrono>
#include <type_traits>

namespace chrono = std::chrono;

int main()
{
  chrono::sys_time now = chrono::system_clock::now();
  chrono::sys_time<chrono::seconds> now_sec = chrono::floor<chrono::seconds>(now);

  // デフォルトコンストラクタ
  chrono::zoned_time z1;
  static_assert(std::is_same_v<
    decltype(z1),
    chrono::zoned_time<chrono::seconds>
  >);

  // システム時間からの推論。
  // システム時間がもっている時間間隔を使用する。
  // (システム時間の時間間隔がマイクロ秒なら、zoned_timeもマイクロ秒)
  chrono::zoned_time z2{now};
  static_assert(std::is_same_v<
    decltype(z2),
    chrono::zoned_time<decltype(now)::duration>
  >);

  // 秒単位のシステム時間からは、秒単位のzoned_timeに推論される
  chrono::zoned_time z3{now_sec};
  static_assert(std::is_same_v<
    decltype(z3),
    chrono::zoned_time<chrono::seconds>
  >);

  // タイムゾーンを与える場合も同様
  chrono::zoned_time z4{chrono::locate_zone("Asia/Tokyo"), now};
  chrono::zoned_time z5{"Asia/Tokyo", now};

  static_assert(std::is_same_v<
    decltype(z4),
    chrono::zoned_time<decltype(now)::duration, chrono::time_zone*>
  >);
  static_assert(std::is_same_v<
    decltype(z5),
    chrono::zoned_time<decltype(now)::duration, chrono::time_zone*>
  >);
}

出力

バージョン

言語

  • C++20

処理系

  • Clang: (9.0時点で実装なし)
  • GCC: (9.2時点で実装なし)
  • Visual C++: (2019 Update 3時点で実装なし)

参照