将 std::chrono 时间点乘以一个标量
Multiply std::chrono timepoint by a scalar
如何将 chrono
timepoint
乘以标量?它适用于 duration
s,但 timepoint
s 不能乘以标量 ("error: invalid operands to binary expression")。
上下文:
我有一些代码在现实生活中会 运行 很长时间。出于测试目的,我希望能够将它加快一个因子,所以一切都发生类似,但只是快进。
我想制作自己的 ScaledClock
class,即 chrono::steady_clock
的 returns 值,但缩放参数可以设置为大于 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,则程序将始终认为已经过去了两倍的时间。它也会睡一半的时间。只要我遵守不在所有时间使用此 class 的纪律,我认为它应该有效。
(或者,如果有人有更好的方法来实现这一点,我很乐意听到)。
编辑:评论的副本,因为我认为它是有用的澄清:
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 中的 运行ning,我并不在意
您需要存储一个起点(now(),例如在程序开始时),然后确定从该起点开始经过的时间作为持续时间。然后,您可以将此持续时间乘以您的因子添加到起点,并将其 return 作为 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;
}
如何将 chrono
timepoint
乘以标量?它适用于 duration
s,但 timepoint
s 不能乘以标量 ("error: invalid operands to binary expression")。
上下文:
我有一些代码在现实生活中会 运行 很长时间。出于测试目的,我希望能够将它加快一个因子,所以一切都发生类似,但只是快进。
我想制作自己的 ScaledClock
class,即 chrono::steady_clock
的 returns 值,但缩放参数可以设置为大于 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,则程序将始终认为已经过去了两倍的时间。它也会睡一半的时间。只要我遵守不在所有时间使用此 class 的纪律,我认为它应该有效。
(或者,如果有人有更好的方法来实现这一点,我很乐意听到)。
编辑:评论的副本,因为我认为它是有用的澄清:
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 中的 运行ning,我并不在意
您需要存储一个起点(now(),例如在程序开始时),然后确定从该起点开始经过的时间作为持续时间。然后,您可以将此持续时间乘以您的因子添加到起点,并将其 return 作为 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;
}