gpt4 book ai didi

c++ - 将 std::chrono 时间点乘以标量

转载 作者:行者123 更新时间:2023-11-28 01:29:35 25 4
gpt4 key购买 nike

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

上下文:

我有一些代码在现实生活中会运行很长时间。出于测试目的,我希望能够将它的速度加快一个因子,这样一切都会发生类似的情况,但只是快进。

我想制作我自己的 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:

Class template std::chrono::time_point represents a point in time. It is implemented as if it stores a value of type Duration indicating the time interval from the start of the Clock's epoch.

所以我想要自纪元以来的所有时间翻倍。如果纪元不是程序执行的开始,而我的代码恰好认为它在 4036 中运行,我真的不在乎

最佳答案

您需要存储一个起点(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;
}

关于c++ - 将 std::chrono 时间点乘以标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52202803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com