C ++,如何缩放std :: chrono :: duration?

时间:2019-07-24 08:10:26

标签: c++ chrono

我不明白您应该如何缩放std::chrono::duration。用浮点数缩放持续时间的正确方法是什么?

template <class Duration>
auto random_duration(Duration low, Duration high) noexcept -> Duration {
    static auto rd = std::random_device();
    static auto re = std::default_random_engine(rd());
    auto dist = std::uniform_real_distribution<double>(0, 1);
    const auto off = std::chrono::duration<Duration>(dist(re) * (high - low));
    return low + off;
}

1 个答案:

答案 0 :(得分:3)

首先,如果您使用两个std::duration<double, ...>对象实例化此模板,则一切正常且按预期进行。您遇到的问题可能是,当输入类型为Duration时,由operator*获得的实例可能无法隐式转换为尾随返回类型(std::duration<int, ...>)。在这种情况下,将其缩放为两倍是有损操作,(如果您打算这样做)本身就可以,但是返回它的原因是Duration not 。除非您明确声明,否则<chrono>不允许进行这种转换。这是一件好事。

这是它如何工作的。

const auto off = dist(re)*((high - low));

return low + std::chrono::duration_cast<Duration>(off);

因此,您需要显式地将输入持续时间有损转换为可以乘以double的持续时间。有了后,为了与尾随返回类型Duration兼容,您需要将其显式转换回去。