这个 boost ptree 块可以更短(更智能)吗?
Can this boost ptree block be shorter (and smarter)?
我正在创建一个 JSON 字符串利用 boost ptree
库,但我发现仅通过执行以下操作就很乏味。我需要向 metrics
ptree 添加一个像 "metric.name" : [A, B]
这样的简单数组。我能做得更好吗?或者至少以一种更简洁的方式写这个。
pt::ptree metric_avg;
metric_avg.put("", 9999);
pt::ptree metric_std;
metric_std.put("", 0);
pt::ptree metric_distr;
metric_distr.push_back({"", metric_avg});
metric_distr.push_back({"", metric_std});
metrics.add_child(metric.name, metric_distr);
我会写一些辅助函数
template<typename T>
pt::ptree scalar(const T & value)
{
pt::ptree tree;
tree.put("", value);
return tree;
}
template<typename T>
pt::ptree array(std::initialiser_list<T> container)
{
pt::ptree tree;
for (auto & v : container)
{
tree.push_back(scalar(v));
}
return tree;
}
这样你就可以写
metrics.put(metric.name, array({ 9999, 0 }));
我会:
ptree metric_avg;
auto& arr = metric_avg.put_child("metric name", {});
arr.push_back({"", ptree("9999")});
arr.push_back({"", ptree("0")});
for (auto el : {"9999", "0"})
arr.push_back({"", ptree(el)});
for (auto el : {9999, 0})
arr.push_back({"", ptree(std::to_string(el))});
全部打印
{
"metric name": [
"9999",
"0"
]
}
另见
我正在创建一个 JSON 字符串利用 boost ptree
库,但我发现仅通过执行以下操作就很乏味。我需要向 metrics
ptree 添加一个像 "metric.name" : [A, B]
这样的简单数组。我能做得更好吗?或者至少以一种更简洁的方式写这个。
pt::ptree metric_avg;
metric_avg.put("", 9999);
pt::ptree metric_std;
metric_std.put("", 0);
pt::ptree metric_distr;
metric_distr.push_back({"", metric_avg});
metric_distr.push_back({"", metric_std});
metrics.add_child(metric.name, metric_distr);
我会写一些辅助函数
template<typename T>
pt::ptree scalar(const T & value)
{
pt::ptree tree;
tree.put("", value);
return tree;
}
template<typename T>
pt::ptree array(std::initialiser_list<T> container)
{
pt::ptree tree;
for (auto & v : container)
{
tree.push_back(scalar(v));
}
return tree;
}
这样你就可以写
metrics.put(metric.name, array({ 9999, 0 }));
我会:
ptree metric_avg;
auto& arr = metric_avg.put_child("metric name", {});
arr.push_back({"", ptree("9999")});
arr.push_back({"", ptree("0")});
for (auto el : {"9999", "0"})
arr.push_back({"", ptree(el)});
for (auto el : {9999, 0})
arr.push_back({"", ptree(std::to_string(el))});
全部打印
{
"metric name": [
"9999",
"0"
]
}
另见