一个简化的例子:
//...
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()
方法可以返回一定数量的刻度作为rep
类型变量,在我的系统上typedef
是long long
代码必须是可移植的。从实际的角度来看,将结果转换count()
为简单的 long 并将其传递给JSON
库有多安全?我是否正确实现了访问器(使用unsigned long
类型)?在实践中,我通常将延迟值存储在 0 到 5000 的范围内,但没有什么能阻止其他人编辑配置文件并在那里写入不正确的值,这可能会导致运行时错误和奇怪的行为。
PS 只是要清楚 - 这不是橡皮鸭调试线程。我以前从未处理过“可能非常大”的值,而具有多个 libstdc++ 实现和 typedef 的 C++ 使其变得困难。我担心潜在的错误和陷阱。谢谢。