我不明白您应该如何缩放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;
}
答案 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
兼容,您需要将其显式转换回去。