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 ❌