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

C++, how do you scale a std::chrono::duration?

我不明白你应该如何缩放 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;
}

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

这是它的工作原理。

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

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

因此,您需要明确地将输入持续时间转换为可以乘以 double 的可能有损转换。一旦你有了它,为了符合尾随 return 类型 Duration,你需要明确地将它转换回来。