这个 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 }));

我会:

Live On Coliru

ptree metric_avg;
auto& arr = metric_avg.put_child("metric name", {});
arr.push_back({"", ptree("9999")});
arr.push_back({"", ptree("0")});

Live On Coliru

for (auto el : {"9999", "0"})
    arr.push_back({"", ptree(el)});

甚至Live On Coliru

for (auto el : {9999, 0})
    arr.push_back({"", ptree(std::to_string(el))});

全部打印

{
    "metric name": [
        "9999",
        "0"
    ]
}

另见