以下代码确实可以编译(g++ 4.7.2):

#include <chrono>

typedef std::chrono::duration< double > double_prec_seconds;
typedef std::chrono::time_point< std::chrono::system_clock > timepoint_t;

void do_something( const timepoint_t& tm )
{
    // ...
}

int main( int argc, char** argv )
{
    timepoint_t t0 = std::chrono::system_clock::now();
    timepoint_t t1 = t0 + std::chrono::seconds(3);

    // timepoint_t t3 = t0 + double_prec_seconds(3.14);
   auto t3 = t0 + double_prec_seconds(3.14);

    do_something( t1 );
}

我的问题是我不知道 t3 有什么类型。它不是 timepoint_t ,并且使用明确给出的类型取消注释行将无法编译。与函数调用相同:我不能用 do_something 调用 t3

所以我的问题是:
  • 为什么转换失败?
  • 拥有 double 秒持续时间的最佳方法是什么?

  • 我知道我可以像这样使用额外的类型转换
    // this works
    timepoint_t t3 = t0 + std::chrono::duration_cast< std::chrono::milliseconds >(double_prec_seconds(3.14));
    

    但我想避免这种情况。

    先感谢您!

    最佳答案

    转换失败,因为没有从

    std::chrono::time_point< std::chrono::system_clock,
                             std::chrono::system_clock::duration >
    


    std::chrono::time_point< std::chrono::system_clock,
                             std::chrono::duration< double > >
    

    最简单的方法是将 double_prec_seconds 作为模板参数提供给 time_point ,参见 std::chrono::time_point
    typedef std::chrono::time_point< std::chrono::system_clock,
                                     double_prec_seconds > timepoint_t;
    

    那么您已经拥有 t3do_something 的正确类型。

    关于c++ - std::chrono:将自定义持续时间添加到 time_point,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15052287/

    10-13 08:24