Вот пример пользовательских хроночасов, основанных на steady_clock
и отсчитывающих время с момента первого вызова (приблизительно):
#include "chrono_io.h"
#include <chrono>
#include <iostream>
struct MyClock
{
using duration = std::chrono::steady_clock::duration;
using rep = duration::rep;
using period = duration::period;
using time_point = std::chrono::time_point<MyClock>;
static constexpr bool is_steady = true;
static time_point now() noexcept
{
using namespace std::chrono;
static auto epoch = steady_clock::now();
return time_point{steady_clock::now() - epoch};
}
};
int
main()
{
using namespace date;
std::cout << MyClock::now().time_since_epoch() << '\n';
std::cout << MyClock::now().time_since_epoch() << '\n';
std::cout << MyClock::now().time_since_epoch() << '\n';
std::cout << MyClock::now().time_since_epoch() << '\n';
}
Нужно просто определить вложенные типы duration
, rep
и period
, которые он может просто украсть из steady_clock
, а затем создать свой собственный time_point
. Не следует использовать time_point
steady_clock
, потому что эпохи MyClock
и steady_clock
различны, и вы не хотите случайно смешать эти два time_point
в арифметике.
Поскольку MyClock
основано на steady_clock
, это is_steady
.
И функция now()
сохраняет текущее время epoch
в static
(оценивается при первом вызове), а затем просто находит время с epoch
при каждом вызове. Это вычитание создает duration
, который можно использовать для построения MyClock::time_point
.
Я использую "chrono_io.h"
только потому, что мне лень форматировать. Вам не нужен этот заголовок для создания собственных часов. Это ничего не делает, но упрощает распечатку длительности.
Эта программа просто выводит для меня:
1618ns
82680ns
86277ns
88425ns
person
Howard Hinnant
schedule
15.03.2017
now()
из существующих часов и вычесть это из будущего времени? У вас есть примеры использования кода, которые вы можете нам показать? - person Howard Hinnant   schedule 14.03.2017