将chrono::milliseconds转换为uint64_t?

4
假设我有一个保存毫秒数的变量,
chrono::milliseconds x = std::chrono::duration_cast<chrono::milliseconds>(something);

如何将xchrono::milliseconds转换为uint64_t?

我已经尝试过:

uint64_t num = std::chrono::duration_cast<uint64_t>(x);

但是它显示:

没有匹配的函数调用 duration_cast(std::chrono::milliseconds&)


2
std::chrono::duration::count会达到你想要的效果吗?http://en.cppreference.com/w/cpp/chrono/duration/count - paco_uk
啊哈,看起来可能行! - user997112
2个回答

4
首先,通常情况下不应该这样做。<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 时间间隔如 chrono::milliseconds 使用有符号表示,因此您需要注意确保该值适合转换为 uint64_t


duration_cast 会处理无符号类型转换成 uint64_t 吗? - user997112
@user997112 它可以进行强制类型转换,但它不会采取任何特殊措施来防止溢出错误或将负值转换为大的无符号值。 - bames53

3

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::uint64_t创建一个std::duration

using cast = std::chrono::duration<std::uint64_t>;
std::uint64_t ticks = std::chrono::duration_cast< cast >(something).count();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接