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

问题描述 投票:0回答:1

怎样才能将chrono timepoint乘以标量?它适用于durations,但timepoints不能乘以标量(“错误:无效的操作数到二进制表达式”)。

语境:

我有一些代码,在现实生活中将运行很长一段时间。出于测试目的,我希望能够通过一个因素来加速它,所以一切都发生了类似的事情,但只是快进。

我想创建自己的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,那么程序将始终认为已经过了两倍的时间。它也会睡一半的时间。只要我对所有时间都没有使用这个课程有纪律,我认为它应该有效。

(或者,如果有人有更好的方法来实现这一点,我很乐意听到它)。


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

恩.CPP reference.com/我/CPP/超人哦你哦/time_point:

类模板std :: chrono :: time_point表示一个时间点。它被实现为好像它存储了一个类型为Duration的值,表示从Clock的纪元开始的时间间隔。

所以我希望自纪元加倍以来所有的时间。如果epoch不是程序执行的开始,并且我的代码碰巧认为它在4036运行,我真的不是很烦

c++ time chrono scalar
1个回答
2
投票

您需要存储一个起点(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;
}
© www.soinside.com 2019 - 2024. All rights reserved.