Как сбросить high_resolution_clock::time_point

Я разрабатываю класс Timer, некоторые из его членов имеют тип high_resolution_clock::time_point где time_point определяется как typedef chrono::time_point<system_clock> time_point;

Вопрос

Каково значение по умолчанию этого объекта?

Мне нужно знать об этом значении по нескольким причинам:

  1. Знать, был ли член инициализирован
  2. Реализовать функцию Timer::Reset()

Фон

class Timer
{
    void Start() { m_tpStop = high_resolution_clock::now(); }
    void Stop() { m_tpStart = high_resolution_clock::now(); }

    bool WasStarted() { /* TO-DO */ }

    void Reset();
    __int64 GetDuration();

    high_resolution_clock::time_point m_tpStart;
    high_resolution_clock::time_point m_tpStop;
};

Итак, могу ли я реализовать Timer::WasStarted, глядя только на элемент m_tpStart? Я хотел бы воздержаться от добавления логического члена для этой цели.


person idanshmu    schedule 02.02.2016    source источник
comment
Вы читали кое-что документы?   -  person Ivan Aksamentov - Drop    schedule 02.02.2016
comment
Возможный дубликат Когда наступает эпоха std::chrono?   -  person Ivan Aksamentov - Drop    schedule 02.02.2016
comment
Что вы хотите, чтобы Timer::Reset() сделал? Что означает сброс таймера?   -  person eerorika    schedule 02.02.2016
comment
Я только что обновил вопрос. Пожалуйста, посмотрите на сам класс. Надеюсь, это прояснится.   -  person idanshmu    schedule 02.02.2016
comment
@user2079303 user2079303, я понимаю, что функция Timer::Reset() требует более подробной информации. Итак, для простоты сосредоточимся на реализации функции Timer::WasStarted. Можно ли это реализовать простым способом?   -  person idanshmu    schedule 02.02.2016


Ответы (1)


Итак, могу ли я реализовать Timer::WasStarted, глядя только на элемент m_tpStart?

Ну, если вы определяете такой инвариант, что m_tpStart равен нулю (эпоха) тогда и только тогда, когда таймер сброшен (не запущен), то это тривиально. Просто проверьте, является ли начало эпохой, чтобы проверить, запущен ли таймер.

Как именно установить точку времени на эпоху, кажется немного запутанным - и я думаю, это то, что вы имеете в виду с «Как сбросить high_resolution_clock::time_point». Вам нужно будет скопировать-назначить созданную по умолчанию временную точку.

void Start() { m_tpStart = high_resolution_clock::now(); }
void Stop() {
    m_tpStop = high_resolution_clock::now();
}
bool WasStarted() {
    return m_tpStart.time_since_epoch().count(); // unit doesn't matter
}
void Reset() {
    m_tpStart = m_tpStop = {};
}
person eerorika    schedule 02.02.2016
comment
как бы вы реализовали GetDuration() с этим? - person sp2danny; 02.02.2016
comment
@ sp2danny Я изменил код, чтобы не сбрасывать запуск при остановке таймера. Это лучше для дизайна ОП. GetDuration теперь просто. Вычесть и бросить. - person eerorika; 02.02.2016