【问题标题】:std::chrono: add custom duration to time_pointstd::chrono:将自定义持续时间添加到 time_point
【发布时间】:2013-02-24 13:40:29
【问题描述】:

以下代码确实可以编译 (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,并且取消注释具有明确给出的类型的行不会编译。函数调用也一样:我不能用t3调用do_something

所以我的问题是:

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

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

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

但我想避免这种情况。

提前谢谢你!

【问题讨论】:

  • 我使用 typeid(t3).name() 打印了 t3 的类型,将 stdout 管道传输到 c++filt,它说 std::chrono::time_point&lt;std::chrono::system_clock, std::chrono::duration&lt;double, std::ratio&lt;1l, 1000000l&gt; &gt; &gt;。仅供参考。
  • 感谢您对工具的提示!我基本上做了同样的事情,只是没有c++filt,除了一个神秘的名字外,没有什么“有用的”。 c++filt 似乎有帮助,不知道。

标签: c++ chrono


【解决方案1】:

转换失败,因为没有来自

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

【讨论】:

  • 完美!谢谢!我试图提供转换,但没有考虑更改我的typedef。我的代码现在看起来和工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2014-04-13
相关资源
最近更新 更多