假设我有可变的毫秒数x
:
chrono::milliseconds x = std::chrono::duration_cast<chrono::milliseconds>(something);
我该如何转换x
from chrono::milliseconds
to uint64_t
?
我努力了:
uint64_t num = std::chrono::duration_cast<uint64_t>(x);
但它说:
没有匹配的函数可供调用
uration_cast(std::chrono::毫秒&)
首先,你一般不应该做这种事情。<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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)