假设我在变量x
中有毫秒数:
chrono::milliseconds x = std::chrono::duration_cast<chrono::milliseconds>(something);
如何将x
从chrono::milliseconds
转换为uint64_t
?
我试过了:
uint64_t num = std::chrono::duration_cast<uint64_t>(x);
但它说:
没有匹配的呼叫功能 duration_cast(标准::计时::毫秒&安培;)
答案 0 :(得分:3)
首先,你通常不应该这样做。 <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
。
答案 1 :(得分:1)
std::chrono::duration_cast
的原型是:
template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep,Period>& d);
您无法直接获得uint64_t
,因为它会转换持续时间(duration_cast)。因此,您需要使用std::duration
创建std::uint64_t
。
using cast = std::chrono::duration<std::uint64_t>;
std::uint64_t ticks = std::chrono::duration_cast< cast >(something).count();