将std :: chrono时间点乘以标量

时间:2018-09-06 11:12:51

标签: c++ time chrono scalar

如何将chrono timepoint与标量相乘?它适用于duration s,但是timepoint s不能乘以标量(“错误:对二进制表达式无效的操作数”)。

上下文:

我有一些在现实生活中可以运行很长时间的代码。出于测试目的,我希望能够将其速度提高一倍,因此所有操作都类似,但速度很快。

我想到了创建自己的ScaledClock类,该类返回chrono::steady_clock的值,但是缩放参数可以设置为大于1的值以实现加速。这是一些代码:

steady_clock::time_point ScaledClock::now() {
    return steady_clock::now() * speedUp; // <--- error
}

void ScaledClock::sleep_for(steady_clock::duration duration) {
    std::this_thread::sleep_for(duration / speedUp);
}

void ScaledClock::sleep_until(steady_clock::time_point time) {
    std::this_thread::sleep_until(time / speedUp); // <--- error
}

例如,如果speedUp为2,则程序将始终认为经过了两倍的时间。它也会睡一半时间。只要我受训不要在所有时间上都使用此类,就可以了。

(或者,如果有人能够以更好的方式实现这一目标,我很乐意听到)。


编辑:评论副本,因为我认为这是有用的说明:

en.cppreference.com/w/cpp/chrono/time_point:

  

类模板std :: chrono :: time_point表示一个时间点。它   的实现方式就好像它存储的是Duration类型的值,指示   从时钟纪元开始的时间间隔。

因此,我希望自从纪元翻倍以来的所有时间。如果那个时期不是程序执行的开始,而我的代码恰好认为它运行在4036年,那么我真的不会感到烦恼

1 个答案:

答案 0 :(得分:1)

您将需要存储一个起点(now(),例如在程序启动时),然后确定自该起点起经过的时间作为持续时间。然后,您可以将此持续时间乘以因子乘以起始点,然后将其作为时间点返回到ScaledClock::now()函数中。就是这样:

#include <chrono>
#include <unistd.h>

int main() {

  auto start = std::chrono::steady_clock::now();

  sleep(1);

  auto actualNow = std::chrono::steady_clock::now();
  auto timePassed = actualNow - start;
  auto timePassedScaled = timePassed * 2.0;
  auto scaledNow = start + timePassedScaled;

  return 0;
}