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
,你需要明确地将它转换回来。
我不明白你应该如何缩放 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
,你需要明确地将它转换回来。