【问题标题】:How to convert std::chrono::system_clock::duration into struct timeval如何将 std::chrono::system_clock::duration 转换为 struct timeval
【发布时间】:2013-06-28 11:12:39
【问题描述】:

标题说明了一切。

我必须实现一个接收 std::chrono::system_clock::duration 值的函数,并且需要将其转换为 timeval sruct,以便我可以将其传递给某个系统函数。

【问题讨论】:

    标签: chrono timeval


    【解决方案1】:

    更通用的实现。

    template<typename Duration>
    void to_timeval(Duration&& d, struct timeval & tv) {
        std::chrono::seconds const sec = std::chrono::duration_cast<std::chrono::seconds>(d);
    
        tv.tv_sec  = sec.count();
        tv.tv_usec = std::chrono::duration_cast<std::chrono::microseconds>(d - sec).count();
    }
    

    更新:

    to_timeval() 这样的单独方法不太方便。哪里有超载的力量?我们刚刚将类型timeval 硬编码为函数名称to_timeval()。这不是 C++ 方式。例如,我想将struct timeval 传递给std::chrono::duration_cast() 并获得我的chrono-result,反之亦然。

    所以,我们可以扩展std::chrono::duration_cast(当然,风险自负)。享受吧。

    namespace std {
    namespace chrono {
    namespace detail {
    
    template<typename From, typename To>
    struct posix_duration_cast;
    
    // chrono -> timeval caster
    template<typename Rep, typename Period>
    struct posix_duration_cast< std::chrono::duration<Rep, Period>, struct timeval > {
    
        static struct timeval cast(std::chrono::duration<Rep, Period> const& d) {
            struct timeval tv;
    
            std::chrono::seconds const sec = std::chrono::duration_cast<std::chrono::seconds>(d);
    
            tv.tv_sec  = sec.count();
            tv.tv_usec = std::chrono::duration_cast<std::chrono::microseconds>(d - sec).count();
    
            return std::move(tv);
        }
    
    };
    
    // timeval -> chrono caster
    template<typename Rep, typename Period>
    struct posix_duration_cast< struct timeval, std::chrono::duration<Rep, Period> > {
    
        static std::chrono::duration<Rep, Period> cast(struct timeval const & tv) {
            return std::chrono::duration_cast< std::chrono::duration<Rep, Period> >(
                        std::chrono::seconds(tv.tv_sec) + std::chrono::microseconds(tv.tv_usec)
                        );
        }
    
    };
    
    }
    
    // chrono -> timeval    
    template<typename T, typename Rep, typename Period>
    auto duration_cast(std::chrono::duration<Rep, Period> const& d)
    -> std::enable_if_t< std::is_same<T, struct timeval>::value, struct timeval >
    {
        return detail::posix_duration_cast< std::chrono::duration<Rep, Period>, timeval >::cast(d);
    }
    
    // timeval -> chrono
    template<typename Duration>
    Duration duration_cast(struct timeval const& tv) {
        return detail::posix_duration_cast< struct timeval, Duration >::cast(tv);
    }
    
    } // chrono
    } // std
    

    这只是一个例子。作为替代方案,我们可以实现自己的duration_cast(),并在某些情况下将其转发到std::chrono::duration_cast()

    我们还记得struct timespec

    【讨论】:

    • 很棒的答案! (为了其他读者的利益)这个答案优越的原因是它没有手动转换因子。它利用 chrono 库进行转换。
    【解决方案2】:

    d 为输入持续时间值,tv 为输出timeval 结构,由convert 函数填充。注意:如果持续时间为负,该函数将 timeval 设置为 0。

    void convert( const std::chrono::system_clock::duration &d, timeval &tv )
    {
      chrono::microseconds usec = chrono::duration_cast<chrono::microseconds>(d);
      if( usec <= chrono::microseconds(0) )
        tv.tv_sec = tv.tv_usec = 0;
      else
      {
        tv.tv_sec = usec.count()/1000000;
        tv.tv_usec = usec.count()%1000000;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2016-07-20
      相关资源
      最近更新 更多