C++,你如何缩放标准::时间::d

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

本文关键字:标准 时间 缩放 何缩放 C++      更新时间:2023-10-16

我不明白你应该如何缩放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* 获得的实例可能无法隐式转换为尾随返回类型 (Duration (。在这种情况下,将其缩放为双精度是一个有损操作,它本身(如果您打算这样做(很好,但将其作为Duration返回则不是。 除非您明确表示,否则<chrono>不允许进行此类转换。这是一件好事。

这是它的工作原理。

const auto off = dist(re)*((high - low));
return low + std::chrono::duration_cast<Duration>(off);

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