C++11 Chrono - 如何将 'unsigned int' 转换为 time_point<system_clock>?
C++11 Chrono - How to cast 'unsigned int' to a time_point<system_clock>?
我有一个具有此签名的函数:
void checkTime (const std::chrono::time_point<std::chrono::system_clock> &time)
{
//do stuff...
}
我需要这样调用上面的函数:
void wait_some_time (unsigned int ms)
{
//do stuff...
checkTime(ms); //ERROR: How can I cast unsigned int to a time_point<system_clock> as now() + some milliseconds?
//do more stuff...
}
我想这样使用:
wait_some_time(200); //wait now + 200ms
问题:
如何将 'unsigned int' 转换为具有毫秒值的 const std::chrono::time_point?
谢谢!
你可以用duration
构造一个time_pont
,你可以用unsigned int
构造一个duration
,所以
using TimePoint = std::chrono::time_point<std::chrono::system_clock>;
using Duration = std::chrono::duration<unsigned int, std::milli>;
checkTime(TimePoint(Duration(ms)));
...虽然我真的不明白你想要达到什么目的:)
编辑:如果你想要现在+毫秒,你可以写
std::chrono::system_clock::now() + Duration(ms)
如果您使用的是 C++14,您可以使用 this
来简化它
auto later = std::chrono::steady_clock::now() + 500ms;
但即使没有 14,我也会将您的函数定义更改为:
void wait_some_time (std::chrono::milliseconds ms);
然后只需将毫秒添加到您的 steady_clock。
如果你真的想支持一个整数,你可以自己实现运算符(原始来源见cppreference)
constexpr std::chrono::milliseconds operator ""ms(unsigned long long ms)
{
return chrono::milliseconds(ms);
}
How can I cast 'unsigned int' to a const std::chrono::time_point that has the milliseconds value ?
A time_point
是一个时间点,表示为某个纪元的偏移量(time_point 的 "zero" 值)。对于 system_clock
,纪元是 00:00:00 1970 年 1 月 1 日。
你的 unsigned int
只是一个偏移量,它不能直接转换为 time_point
因为它没有与之关联的纪元信息。
所以要回答 "how do you convert an unsigned int
to a time_point
?" 这个问题,您需要知道 unsigned int
代表什么。自纪元开始以来的秒数?自您上次调用该功能以来的小时数?几分钟后?
如果它的意思是"now + N milliseconds"那么N对应一个duration
,单位是毫秒。您可以使用 std::chrono::milliseconds(ms)
轻松将其转换为该类型(其中类型 milliseconds
是类似 std::chrono::duration<long long, std::milli>
的类型定义,即表示为以千分之一秒为单位的带符号整数类型的持续时间) .
然后要获得对应于 "now + N milliseconds" 的 time_point,您只需将 duration
添加到从相关时钟获得的 "now" 的 time_point
值:
std::chrono::system_clock::now() + std::chrono::milliseconds(ms);
我有一个具有此签名的函数:
void checkTime (const std::chrono::time_point<std::chrono::system_clock> &time)
{
//do stuff...
}
我需要这样调用上面的函数:
void wait_some_time (unsigned int ms)
{
//do stuff...
checkTime(ms); //ERROR: How can I cast unsigned int to a time_point<system_clock> as now() + some milliseconds?
//do more stuff...
}
我想这样使用:
wait_some_time(200); //wait now + 200ms
问题:
如何将 'unsigned int' 转换为具有毫秒值的 const std::chrono::time_point?
谢谢!
你可以用duration
构造一个time_pont
,你可以用unsigned int
构造一个duration
,所以
using TimePoint = std::chrono::time_point<std::chrono::system_clock>;
using Duration = std::chrono::duration<unsigned int, std::milli>;
checkTime(TimePoint(Duration(ms)));
...虽然我真的不明白你想要达到什么目的:)
编辑:如果你想要现在+毫秒,你可以写
std::chrono::system_clock::now() + Duration(ms)
如果您使用的是 C++14,您可以使用 this
来简化它auto later = std::chrono::steady_clock::now() + 500ms;
但即使没有 14,我也会将您的函数定义更改为:
void wait_some_time (std::chrono::milliseconds ms);
然后只需将毫秒添加到您的 steady_clock。 如果你真的想支持一个整数,你可以自己实现运算符(原始来源见cppreference)
constexpr std::chrono::milliseconds operator ""ms(unsigned long long ms)
{
return chrono::milliseconds(ms);
}
How can I cast 'unsigned int' to a const std::chrono::time_point that has the milliseconds value ?
A time_point
是一个时间点,表示为某个纪元的偏移量(time_point 的 "zero" 值)。对于 system_clock
,纪元是 00:00:00 1970 年 1 月 1 日。
你的 unsigned int
只是一个偏移量,它不能直接转换为 time_point
因为它没有与之关联的纪元信息。
所以要回答 "how do you convert an unsigned int
to a time_point
?" 这个问题,您需要知道 unsigned int
代表什么。自纪元开始以来的秒数?自您上次调用该功能以来的小时数?几分钟后?
如果它的意思是"now + N milliseconds"那么N对应一个duration
,单位是毫秒。您可以使用 std::chrono::milliseconds(ms)
轻松将其转换为该类型(其中类型 milliseconds
是类似 std::chrono::duration<long long, std::milli>
的类型定义,即表示为以千分之一秒为单位的带符号整数类型的持续时间) .
然后要获得对应于 "now + N milliseconds" 的 time_point,您只需将 duration
添加到从相关时钟获得的 "now" 的 time_point
值:
std::chrono::system_clock::now() + std::chrono::milliseconds(ms);