Умножьте время std :: chrono на скаляр - PullRequest
0 голосов
/ 06 сентября 2018

Как можно умножить chrono timepoint на скаляр?Это работает для duration с, но 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, то программа всегда будет думать, что прошло вдвое больше времени.Он также будет спать вдвое дольше.Пока я дисциплинирован о том, чтобы не использовать этот класс для любого времени, я думаю, что он должен работать.

(В качестве альтернативы, если у кого-то есть намного лучший способ достичь этого, я бы хотел услышать это)


Редактировать: копия комментария, потому что я думаю, что это полезное уточнение:

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

Шаблон класса std :: chrono :: time_point представляет точку во времени.Он реализован так, как будто в нем хранится значение типа Duration, указывающее временной интервал с начала эпохи часов.

Так что я хочу, чтобы все времена с тех пор, как эпоха удвоилась.Если эпоха не является началом выполнения программы, и мой код думает, что она работает в 4036 году, я не очень обеспокоен

1 Ответ

0 голосов
/ 06 сентября 2018

Вам нужно будет сохранить начальную точку (сейчас (), например, при запуске программы), а затем определить время, прошедшее с этой начальной точки, как длительность.Затем вы можете добавить эту длительность, умноженную на ваш коэффициент, к начальной точке и вернуть ее как точку времени в вашей функции 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;
}
...