C ++ 11 Chrono - 如何投射&#39; unsigned int&#39;到time_point <system_clock>?

时间:2015-07-14 08:28:36

标签: c++11 chrono

我有一个具有此签名的功能:

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 

问题:

如何投射&#39; unsigned int&#39;到具有毫秒值的const std :: chrono :: time_point?

谢谢!

3 个答案:

答案 0 :(得分:3)

如果您使用的是C ++ 14,则可以使用this

来简化它
auto later = std::chrono::steady_clock::now() + 500ms;

但即使没有14,我也会将你的功能定义改为:

void wait_some_time (std::chrono::milliseconds ms);

然后只需将毫秒添加到您的steady_clock。 如果你真的想支持一个整数,你可以自己实现运算符(参见cppreference for original source)

constexpr std::chrono::milliseconds operator ""ms(unsigned long long ms)
{
    return chrono::milliseconds(ms);
}

答案 1 :(得分:1)

您可以使用time_pont构建duration,然后使用duration构建unsigned int,所以

using TimePoint = std::chrono::time_point<std::chrono::system_clock>; 
using Duration = std::chrono::duration<unsigned int, std::milli>;
checkTime(TimePoint(Duration(ms)));

......虽然我真的没有看到你想要达到的目标:)

编辑:如果你现在想要+ ms,你可以写

std::chrono::system_clock::now() + Duration(ms)

答案 2 :(得分:1)

  

如何投射&#39; unsigned int&#39;到具有毫秒值的const std :: chrono :: time_point?

time_point是一个时间点,表示为某个时期的偏移量(时间点的&#34;零&#34;值)。对于system_clock,纪元是1970年1月1日00:00:00。

您的unsigned int只是一个偏移,它无法直接转换为time_point,因为它没有与之关联的纪元信息。

所以回答问题&#34;如何将unsigned int转换为time_point?&#34;你需要知道unsigned int代表什么。从纪元开始以来的秒数?你上次调用这个函数后的小时数?从现在开始几分钟?

如果它的意思是&#34;现在+ N毫秒&#34;那么N对应于duration,以毫秒为单位测量。您可以使用std::chrono::milliseconds(ms)轻松将其转换为milliseconds(其中类型std::chrono::duration<long long, std::milli>duration类型的typedef,即以1000秒为单位表示为有符号整数类型的持续时间

然后得到对应于&#34;现在+ N毫秒&#34;的time_point。您只需将time_point添加到&#34;现在&#34;的 std::chrono::system_clock::now() + std::chrono::milliseconds(ms); 值从相关时钟获得:

_appDelegate.managedObjectContext