Первый из всего, вы, как правило, не должны делать такого рода вещи. <chrono>
предоставляет библиотеку типов и универсальных модулей для обработки продолжительности времени, и есть несколько веских причин избежать этой безопасности и универсальности.
Некоторых примеров недугов, которые не случаются с типобезопасным, общей библиотекой блоков и которые случаются с типом небезопасного интегральными типами:
// a type-safe units library prevents these mistakes:
int seconds = ...
int microseconds = seconds * 1000; // whoops
int time = seconds + microseconds; // whoops
void bar(int seconds);
bar(microseconds); // whoops
// a generic duration type prevents the need for:
unsigned sleep(unsigned seconds);
int usleep(useconds_t useconds);
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
int attosleep(long long attoseconds); // ???
// just use:
template<typename Duration>
int sleep_for(Duration t); // users can specify sleep in terms of hours, seconds, microseconds, femetoseconds, whatever. Actual sleep duration depends on QoI, as always.
Примером хорошей причиной будет совместимость с сторонней библиотекой, которая сделала неудачное решение не использовать библиотеку универсальных единиц типа в своем API. В этом случае конверсии должны выполняться как можно ближе к границе API, чтобы минимизировать степень использования небезопасных типов.
Так с тем, что, когда у вас есть хорошая причина, вы делаете так, как это:
std::chrono::milliseconds x = ...
std::uint64_t num = x.count();
Имейте в виде, что предопределенные хроы длительности, такие как chrono::milliseconds
использования подписало представление, так что вы необходимо позаботиться о том, чтобы значение было подходящим для преобразования в uint64_t
.
Был ли std :: chrono :: duration :: count делать то, что вы хотите? http://en.cppreference.com/w/cpp/chrono/duration/count –
ah ha, похоже, что это возможно! – user997112