# std::chrono::clock_time_conversion

< cpp‎ | chrono

定义于头文件 `<chrono>` |  |
template<class Dest, class Source> struct clock_time_conversion { }; |  | (C++20 起)

`std::chrono::clock_time_conversion` 是特性类，指定如何转换 `Source` 时钟的 std::chrono::time_point 到 `Dest` 时钟的时间点。它通过提供 const 可调用的，接受 std::chrono::time_point<Source, Duration> 类型参数并返回表示等价时间点的 std::chrono::time_point<Dest, OtherDuration> 的 `operator()` 进行转换。以对每个特化有所变化的方式，计算返回时间点的时长。通常只通过 std::chrono::clock_cast 间接使用 `clock_time_conversion` 。

程序可以特化 `clock_time_conversion` ，若至少一个模板形参是用户定义类型。

初等模板是空 struct 。标准定义下列特化：

template<class Clock> struct clock_time_conversion<Clock, Clock>; | (1) | (C++20 起)
template<> struct clock_time_conversion<std::chrono::system_clock, std::chrono::system_clock>; | (2) | (C++20 起)
template<> struct clock_time_conversion<std::chrono::utc_clock, std::chrono::utc_clock>; | (3) | (C++20 起)
template<> struct clock_time_conversion<std::chrono::system_clock, std::chrono::utc_clock>; | (4) | (C++20 起)
template<> struct clock_time_conversion<std::chrono::utc_clock, std::chrono::system_clock>; | (5) | (C++20 起)
template<class Clock> struct clock_time_conversion<Clock, std::chrono::system_clock>; | (6) | (C++20 起)
template<class Clock> struct clock_time_conversion<std::chrono::system_clock, Clock>; | (7) | (C++20 起)
template<class Clock> struct clock_time_conversion<Clock, std::chrono::utc_clock>; | (8) | (C++20 起)
template<class Clock> struct clock_time_conversion<std::chrono::utc_clock, Clock>; | (9) | (C++20 起)

1-3) 恒等转换： `operator()` 返回参数的副本。
4-5) std::chrono::sys_time 与 std::chrono::utc_time 间的转换： `operator()` 分别调用 std::chrono::utc_clock::to_sys 和 std::chrono::utc_clock::from_sys 。
6-7) `Clock` 支持 `from_sys` 和 `to_sys` 时，来自和到 std::chrono::sys_time 的转换： `operator()` 分别调用 Clock::to_sys 和 Clock::from_sys 。
8-9) `Clock` 支持 `from_utc` 和 `to_utc` 时，来自和到 std::chrono::utc_time 的转换： `operator()` 分别调用 Clock::to_utc 和 Clock::from_utc 。

### 成员函数

每个特化都有隐式声明的默认构造函数、复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符和析构函数。

## std::chrono::clock_time_conversion::operator()

template <class Duration> std::chrono::time_point<Clock, Duration> operator()(const std::chrono::time_point<Clock, Duration>& t) const; | (1) | (特化 (1) 的成员)
template <class Duration> std::chrono::sys_time<Duration> operator()(const std::chrono::sys_time<Duration> & t) const; | (2) | (特化 (2) 的成员)
template <class Duration> std::chrono::utc_time<Duration> operator()(const std::chrono::utc_time<Duration>& t) const; | (3) | (特化 (3) 的成员)
template <class Duration> std::chrono::sys_time<Duration> operator()(const std::chrono::utc_time<Duration>& t) const; | (4) | (特化 (4) 的成员)
template <class Duration> std::chrono::utc_time<Duration> operator()(const std::chrono::sys_time<Duration>& t) const; | (5) | (特化 (5) 的成员)
template <class Duration> auto operator()(const std::chrono::sys_time<Duration>& t) const -> decltype(Clock::from_sys(t)); | (6) | (特化 (6) 的成员)
template <class Duration> auto operator()(const std::chrono::time_point<SourceClock, Duration>& t) const -> decltype(Clock::to_sys(t)); | (7) | (特化 (7) 的成员)
template <class Duration> auto operator()(const std::chrono::utc_time<Duration>& t) const -> decltype(Clock::from_utc(t)); | (8) | (特化 (8) 的成员)
template <class Duration> auto operator()(const std::chrono::time_point<Clock, Duration>& t) const -> decltype(Clock::to_utc(t)); | (9) | (特化 (9) 的成员)

转换参数 std::chrono::time_point 为目标时钟。

1-3) 恒等转换。返回不更改的 `t` 。
4) 返回 std::chrono::utc_clock::to_sys(t) 。
5) 返回 std::chrono::utc_clock::from_sys(t) 。
6) 返回 Clock::from_sys(t) 。此重载仅若表达式 Clock::from_sys(t) 为良式才参与重载决议。若 Clock::from_sys(t) 不返回 std::chrono::time_point<Clock, Duration> ，其中 `Duration` 是 std::chrono::duration 的某个合法特化，则程序为病式。
7) 返回 Clock::to_sys(t) 。此重载仅若表达式 Clock::to_sys(t) 为良式才参与重载决议。若 Clock::to_sys(t) 不返回 std::chrono::sys_time<Duration> ，其中 `Duration` 是 std::chrono::duration 的某个合法特化，则程序为病式。
8) Returns Clock::from_utc(t) 。此重载仅若表达式 Clock::from_utc(t) 为良式才参与重载决议。若 Clock::from_utc(t)不返回 std::chrono::time_point<Clock, Duration> ，其中 `Duration` 是 std::chrono::duration 的某个合法特化，则程序为病式。
9) 返回 Clock::to_utc(t) 。此重载仅若表达式 Clock::to_utc(t) 为良式才参与重载决议。若 Clock::to_utc(t) 不返回 std::chrono::utc_time<Duration> ，其中 `Duration` 是 std::chrono::duration 的某个合法特化，则程序为病式。

### 参数

t | - | 要转化的时间点

### 返回值

上述的转换结果：

1-3) `t` 。
4) std::chrono::utc_clock::to_sys(t) 。
5) std::chrono::utc_clock::from_sys(t) 。
6) Clock::from_sys(t) 。
7) Clock::to_sys(t) 。
8) Clock::from_utc(t) 。
9) Clock::to_utc(t) 。

### 参阅

clock_cast (C++20) | 转换一个时钟的时间点为另一个 (函数模板)