【问题标题】:comparing STL chrono results with floating point将 STL chrono 结果与浮点数进行比较
【发布时间】:2015-03-19 11:23:30
【问题描述】:

我正在尝试使用 C++ 11 中的 STL chrono 库来测量循环的持续时间。因此,我正在尝试执行以下操作:

using std::chrono;

double frame_time = 40; // Temporal resolution milliseconds
auto start = high_resolution_clock::now();
while (get_frame(frame)) {
    // Do something
    auto end = high_resolution_clock::now();
    auto elapsed = duration_cast<milliseconds>(end - start);

    // Now I want to do something like:
    if (elapsed < frame_time) { sleep(frame_time-elapsed);}
    start = high_resolution_clock::now();
}

但是,这种比较会导致如下错误:

 no match for ‘operator<’ (operand types are ‘std::chrono::duration<long 
                           int, std::ratio<1l, 1000l> >’ and ‘double’)

【问题讨论】:

    标签: c++ stl chrono


    【解决方案1】:

    您的frame_time 也是一个持续时间,那么为什么不使用std::chrono::milliseconds?这样一来,您的代码就会变得更简洁(一开始就不需要您的注释)并且更安全,例如,如果将 sleep() 更改为使用微秒,编译器可以警告您或选择正确的重载。

    【讨论】:

    • 抱歉有点糊涂了。这里的 frame_time 是 double 类型的变量。您的意思是将其转换为持续时间类型?
    • 不,不转换。首先不要使用double。将frame_time 设为milliseconds 类型的变量。
    • 啊……我明白了。我简化了一点。 frame_time 实际上来自第三方库,这会将其作为 double 类型返回。我将其设置为一些硬编码值以强调我的问题。
    • 然后转换,还是按照域做计算,让类型系统处理单元正确性
    【解决方案2】:

    你不能比较 chrono::duration 和 double。只需使用持续时间对象的count 函数即可。

    if (elapsed.count() < frame_time) 
    { 
       sleep(frame_time-elapsed.count());
    }
    

    【讨论】:

    • 谢谢!做了我想要的:)
    • 或更好地使用 std::chrono::milliseconds 而不是 double 作为 frame_time
    • @FabioFracassi:这应该是一个替代答案(我会赞成这个答案)
    猜你喜欢
    • 2013-11-19
    • 2023-04-02
    • 2021-08-29
    • 2021-05-28
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多