std :: chrono:为time_point添加自定义持续时间

时间:2013-02-24 13:40:30

标签: c++ chrono

以下代码编译(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

所以我的问题是:

  • 为什么转换失败?
  • 具有双精度秒持续时间的最佳方法是什么?

我知道我可以使用像这样的额外演员

// this works
timepoint_t t3 = t0 + std::chrono::duration_cast< std::chrono::milliseconds >(double_prec_seconds(3.14));

但我想避免这种情况。

提前谢谢!

1 个答案:

答案 0 :(得分:8)

转换失败,因为

没有转换
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的正确类型。