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

履歴 編集

class template
<chrono>

std::chrono::is_clock(C++20)

namespace std::chrono {
  template <class T>
  struct is_clock;                                       // (1) C++20

  template <class T>
  inline constexpr bool is_clock_v = is_clock<T>::value; // (2) C++20
}

概要

is_clockは、クロック型かを判定する型特性である。

TがClock要件を満たす場合はtrue_typeから派生し、そうでなければfalse_typeから派生する。

Clock要件を満たすには、以下が必要である:

有効であるべき式 戻り値 操作の意味論
C1::rep 算術型もしくはそのように振る舞うクラス C1::durationの値型
C1::period std::ratioの特殊化 クロックの時間周期 (秒ベース)
C1::duration chrono::duration<C1::rep, C1::period> クロックのduation
C1::time_point chrono::time_point<C1>もしくはchrono::time_point<C2, C1::duration> クロックのtime_point型。C1C2は同じエポックを参照する
C1::is_steady const bool t1 <= t2が常に真であり (注:時間が戻らない)、時間間隔が常に一定である場合にtrue、そうでなければfalse
C1::now() C1::time_point 現在の時間点を表すtime_pointオブジェクトを返す

ここで、以下のように定義する:

  • C1C2 : クロックの種類
  • t1t2 : C1::now()によって返される値。ここで、t1を返すnow()呼び出しはt2を返すnow()呼び出しよりも前に発生し、これらの呼び出しは両方ともC1::time_point::max()よりも前に発生するものとする (注: これは、C1t1t2の間でラップアラウンドしていないことを意味する)

is_clockは、以下を満たさない限り、Clock要件として適格ではない:

  • 修飾された型Tが、T::periodT::durationT::time_pointメンバ型を持っていること
  • T::is_steadyが評価されないオペランドで使用された場合に妥当であること
  • T::now()が評価されないオペランドで使用された場合に妥当であること

is_clockの特殊化を追加した場合のプログラムの動作は未定義である。

#include <chrono>

using namespace std::chrono;

int main()
{
  static_assert(is_clock_v<system_clock>);
  static_assert(is_clock_v<steady_clock>);
  static_assert(is_clock_v<high_resolution_clock>);
  static_assert(is_clock_v<utc_clock>);
  static_assert(is_clock_v<tai_clock>);
  static_assert(is_clock_v<gps_clock>);
  static_assert(is_clock_v<file_clock>);
}

出力

バージョン

言語

  • C++20

処理系