访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型

What type to use when accessing and storing/parsing std::chrono::duration::milliseconds (cpprest)

本文关键字:cpprest 类型 什么 持续时间 存储 解析性 std 访问 Chrono milliseconds      更新时间:2023-10-16

一个简化的示例:

//...
std::chrono::milliseconds _delay; //field in question
unsigned long getDelay() const
{
    return _delay.count();
}
void setDelay(unsigned long delay)
{
    _delay = std::chrono::milliseconds(delay);
}
json::value toJson() const
{
    using namespace web;
    json::value obj;
    obj[delay] = json::value::number(_delay.count());
    return obj;
}
bool fromJson(web::json::value value)
{
    for (auto it = value.as_object().cbegin(); it != value.as_object().cend(); ++it)
    {
        const std::string& str = it->first;
        const json::value& v = it->second;
        if (str == "delay")
        {
            if (v.is_integer())
            {
                _id = v.as_number().to_uint64(); //was v.as_integer(); - thx Nicol Bogas
                continue;
            }
            else
            {
                return false;
            }
        }
        //...
    }
}

我的类包含一堆std::chrono::milliseconds字段,这些字段代表相应的延迟。我想将这些值存储在类的JSON表示中。大多数JSON值仅使用标准内部类型运行,但是std::chrono::milliseconds实现std::chrono::duration模板。它具有count()方法,该方法将tick数量返回为rep类型的变量,该变量是我的系统上的typedeflong long

要求代码可移植。从实际的角度来看,将count()的结果转换为简单的长度并将其传递给JSON库有多安全?我是否正确实现了登录器(使用unsigned long类型(?实际上,我通常将延迟值存储在0到5000范围内,但是没有什么可以阻止其他人编辑配置文件并在那里编写错误的值,这可能会导致运行时错误和奇怪的行为。

P.S。只是要清楚 - 这不是橡皮鸭调试线。我以前从未处理过"可能是很大的"值,而C 具有多个LIBSTDC 的实现和Typedefs,因此很难。我担心潜在的虫子和陷阱。谢谢。

我建议定义您自己的持续时间类型"双精度秒"。然后可以将其作为计数提取,并以清晰明确的含义传递给其他语言。一些示例代码(与JSON无关(:

 TimePoint nowTime(std::chrono::system_clock::now());
 typedef std::chrono::duration<double>       FSeconds;
 FSeconds delta = std::chrono::duration_cast<FSeconds>(nowTime - startTime);
 ofs << "@" << std::fixed << delta.count() //...

所以在这里,delta.count是秒,但它是真实的,而不是整数,因此保存在小数中的miliseconds或其他。

在实践中,大多数JSON实现都使用64位IEEE float,aka double in C ,用于所有数字。

因此,您有一些不匹配:C milliseconds可以以完全的精度存储/- 9E18,但是JSON编号可以存储/- 1.8E308(但只有53位精度(。

>

因此,如果您的C 值超过285千瓦(2^53毫秒(,则将失去精度。对于您的应用程序来说,这似乎没问题,因为该值是"延迟",没有人有时间这样做。如果您的JSON解析逻辑读取的值大于INT64_MAX,则可能会引发异常。