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型。C1とC2は同じエポックを参照する |
C1::is_steady |
const bool |
t1 <= t2が常に真であり (注:時間が戻らない)、時間間隔が常に一定である場合にtrue、そうでなければfalse |
C1::now() |
C1::time_point |
現在の時間点を表すtime_pointオブジェクトを返す |
ここで、以下のように定義する:
C1とC2: クロックの種類t1とt2:C1::now()によって返される値。ここで、t1を返すnow()呼び出しはt2を返すnow()呼び出しよりも前に発生し、これらの呼び出しは両方ともC1::time_point::max()よりも前に発生するものとする (注: これは、C1がt1とt2の間でラップアラウンドしていないことを意味する)
is_clockは、以下を満たさない限り、Clock要件として適格ではない:
- 修飾された型
Tが、T::period、T::duration、T::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
処理系
- Clang: 9.0 ❌
- GCC: 9.2 ❌
- Visual C++: 2019 Update 3 ❌