gpt4 book ai didi

c++ - 如何检查 duration_cast 是否溢出

转载 作者:可可西里 更新时间:2023-11-01 18:38:18 26 4
gpt4 key购买 nike

我需要将一种 std::chrono::duration 转换为另一种,但我需要知道何时无法进行这种转换,因为该值无法表示。

我没有在标准库中找到任何工具来检查这个。 cppreference page没有指定如果值超出范围会发生什么,只是从 float 到整数的转换可能是未定义的行为(在我的例子中,我需要从整数转换为整数)。

最佳答案

没有一刀切的解决方案,但是适合许多用例的解决方案是使用基于doubleduration 用于范围检查。也许是这样的:

#include <chrono>
#include <iostream>
#include <stdexcept>

template <class Duration, class Rep, class Period>
Duration
checked_convert(std::chrono::duration<Rep, Period> d)
{
using namespace std::chrono;
using S = duration<double, typename Duration::period>;
constexpr S m = Duration::min();
constexpr S M = Duration::max();
S s = d;
if (s < m || s > M)
throw std::overflow_error("checked_convert");
return duration_cast<Duration>(s);
}

int
main()
{
using namespace std::chrono;
std::cout << checked_convert<nanoseconds>(10'000h).count() << "ns\n";
std::cout << checked_convert<nanoseconds>(10'000'000h).count() << "ns\n";
}

对我来说这个输出:

36000000000000000ns
libc++abi.dylib: terminating with uncaught exception of type std::overflow_error: checked_convert

关于c++ - 如何检查 duration_cast 是否溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44635941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com