代码之家  ›  专栏  ›  技术社区  ›  wal-o-mat

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

  •  14
  • wal-o-mat  · 技术社区  · 12 年前

    以下代码确实编译( 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 回复  |  直到 12 年前
        1
  •  11
  •   Olaf Dietsche    12 年前

    转换失败,因为没有来自

    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;
    

    那么你已经有了合适的类型 t3 do_something .