首页 > 解决方案 > 如何在运行时设置纪元创建可实例化的自定义时钟

问题描述

我的问题类似于这个问题(如何创建用于 std::chrono 函数的自定义时钟?),但有两个细微差别:

  1. 时代直到运行时才知道
  2. 可能有多个时钟实例,每个实例都有自己的纪元

我正在考虑的用例是视频流时间。即视频流中的每一帧都有一个相对于第一帧时间戳的时间戳(pts,表示时间戳)。可能有多个视频流,每个视频流都有自己的流开始时间。

我认为直到运行时才知道时代很容易,只需添加一个set_epoch函数。但是我不确定在now()函数是静态的情况下如何实例化(我认为它需要set_epoch是静态的。)

到目前为止,我只是通过将时间戳设置为 aduration而不是a 来处理这个问题,time_point但这似乎是对类型的一种滥用。这也是最好的解决方案还是有更好的方法?我想也许一个更广泛的问题是,使用 atime_pointdurationtype 作为时间戳更好吗?Atime_point似乎很自然,但这意味着您必须全天候定义。Aduration似乎不符合预期的定义,但将其与clock定义分离。

标签: c++chrono

解决方案


最终,我认为您是在说:我需要一个有状态的 chrono::clock。正确的?

纪元必须是时钟的运行时数据成员。这并不真正符合Cpp17Clock 要求

原来C++20类型std::chrono::local_t也是不符合Cpp17Clock要求的时钟:

// [time.clock.local], local time
struct local_t {};

方便链接:http ://eel.is/c++draft/time.clock.local

表示的时间点族local_­time<Duration>基于伪时钟local_­tlocal_­t没有成员now(),因此不符合时钟要求。

P2212是为解决不符合Cpp17Clock 要求的时钟而编写的。事实证明,可以time_point毫无问题地基于这样的时钟创建 s。 对此类时钟唯一不能做的就是调用需要Cpp17Clock 要求的算法。例如std::this_thread::sleep_until.

但是如果你不想sleep_until用 a 跟MyCuriousClock::time_point注,那么没有伤害,没有犯规。如果标准可以创建std::chrono::local_t不符合Cpp17Clock 要求的时钟 () ,那么您也可以——只要您了解它的局限性。


推荐阅读