Прежде всего, вы вообще не должны делать такого рода вещи. <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
.
person
bames53
schedule
10.03.2015