首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个boost ptree块能更短(更聪明)吗?

这个boost ptree块能更短(更聪明)吗?
EN

Stack Overflow用户
提问于 2021-01-28 11:47:26
回答 2查看 46关注 0票数 1

我正在利用boost ptree库创建一个JSON字符串,但通过执行以下操作,我发现它很乏味。我需要将像"metric.name" : [A, B]这样的简单数组添加到metrics ptree中。我能做得更好吗?或者至少用一种更干净的方式写这个。

代码语言:javascript
复制
      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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-28 13:55:27

我会写一些助手函数

代码语言:javascript
复制
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;
}

这样你就可以写了

代码语言:javascript
复制
metrics.put(metric.name, array({ 9999, 0 }));
票数 2
EN

Stack Overflow用户

发布于 2021-01-29 00:40:11

我会:

住在Coliru

代码语言:javascript
复制
ptree metric_avg;
auto& arr = metric_avg.put_child("metric name", {});
arr.push_back({"", ptree("9999")});
arr.push_back({"", ptree("0")});

住在Coliru

代码语言:javascript
复制
for (auto el : {"9999", "0"})
    arr.push_back({"", ptree(el)});

甚至是住在Coliru

代码语言:javascript
复制
for (auto el : {9999, 0})
    arr.push_back({"", ptree(std::to_string(el))});

全都印出来了

代码语言:javascript
复制
{
    "metric name": [
        "9999",
        "0"
    ]
}

另见使用Boost的JSON数组::Ptree

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65936511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档