【问题标题】:C++11 Chrono - How to cast 'unsigned int' to a time_point<system_clock>?C ++ 11 Chrono - 如何将'unsigned int'转换为time_point<system_clock>?
【发布时间】:2015-07-14 08:28:36
【问题描述】:

我有一个具有此签名的函数:

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 ?

谢谢!

【问题讨论】:

  • 对不起,我完全不明白你在追求什么。什么是“具有毫秒值的时间点”?你如何定义这样的演员阵容?我的意思是,您的问题看起来像“-现在几点(time_point)?- 500 毫秒(您的uint)。”无论您是想检查时间还是等待一段时间,都很难从您的代码中得出。这对我来说是两件不同的事情。检查时间应该做什么?
  • 您可以通过几种方式进行投射。问题是您如何将持续时间传递给需要 time_point 的函数(例如,自纪元以来的持续时间)?语义是什么?
  • 对不起...例如从现在开始 + 200 毫秒

标签: c++11 chrono


【解决方案1】:

如何将 'unsigned int' 转换为具有毫秒值的 const std::chrono::time_point?

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

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

所以要回答“如何将unsigned int 转换为time_point?”这个问题。你需要知道unsigned int 代表什么。自纪元开始以来的秒数?自您上次调用该函数以来的小时数?几分钟后?

如果它的意思是“现在 + N 毫秒”,那么 N 对应于 duration,以毫秒为单位。您可以使用std::chrono::milliseconds(ms) 轻松将其转换为该类型(其中milliseconds 类型是std::chrono::duration&lt;long long, std::milli&gt; 之类的类型定义,即表示为以千分之一秒为单位的有符号整数类型的持续时间)。

然后要获得与“现在 + N 毫秒”对应的时间点,您只需将 duration 添加到从相关时钟获得的“现在”的 time_point 值:

    std::chrono::system_clock::now() + std::chrono::milliseconds(ms);

【讨论】:

    【解决方案2】:

    如果你使用的是 C++14,你可以使用 this 来简化它

    auto later = std::chrono::steady_clock::now() + 500ms;
    

    但即使没有 14,我也会将您的函数定义更改为:

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

    然后只需将毫秒添加到您的 stable_clock。 如果你真的想支持整数,你可以自己实现操作符(原始来源见cppreference)

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

    【讨论】:

      【解决方案3】:

      你可以用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)));
      

      ...虽然我并没有真正看到你想要实现的目标:)

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

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

      【讨论】:

      • 您的第二个 typedef 可以替换为 std::chrono::milliseconds
      • 这会给出错误的答案,从 1970 年 1 月 1 日起将是 200 毫秒,而不是从现在起 200 毫秒。
      • @JonathanWakely 您不能使用std::chrono::milliseconds,因为它已签名,而我们想要未签名。至于答案,当我写这篇文章时,并没有澄清提问者想要的时代是什么。我会相应地编辑它...
      • 变量ms 是无符号的,但是为什么将其转换为带符号表示或无符号表示的持续时间很重要?它仍然代表相同的毫秒数。
      猜你喜欢
      • 1970-01-01
      • 2018-07-27
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      相关资源
      最近更新 更多