访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型
What type to use when accessing and storing/parsing std::chrono::duration::milliseconds (cpprest)
一个简化的示例:
//...
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
类型的变量,该变量是我的系统上的typedef
到long 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,则可能会引发异常。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型