C++ 从Boost属性树中提取STL映射

C++ 从Boost属性树中提取STL映射,c++,boost,stl,C++,Boost,Stl,我理解,boost::property_tree::ptree可能包含键值对,其中“value”可以是任何类型。现在我的问题是,现在我的‘值’是一个std::map,当我尝试pt.get其中pt是一个属性树时,我会得到一个编译时错误。因此,我的问题是: 如何从boost属性树中提取STL映射值?如果这是不可能的,有没有办法在STL映射和boost属性树之间进行转换(这样属性树的每个节点都不是STL容器,而是一个简单的数据类型)非常简单: ptree pt; std::map<std::

我理解,
boost::property_tree::ptree
可能包含键值对,其中“value”可以是任何类型。现在我的问题是,现在我的‘值’是一个
std::map
,当我尝试
pt.get
其中
pt
是一个属性树时,我会得到一个编译时错误。因此,我的问题是:

如何从boost属性树中提取STL映射值?如果这是不可能的,有没有办法在STL映射和boost属性树之间进行转换(这样属性树的每个节点都不是STL容器,而是一个简单的数据类型)

非常简单:

ptree pt;

std::map<std::string, ptree> m(pt.begin(), pt.end());
#include <boost/property_tree/ptree.hpp>
#include <map>
#include <fmt/ranges.h>
using boost::property_tree::ptree;

template<> struct fmt::formatter<ptree> : fmt::formatter<std::string>
{
    template<typename Ctx>
    auto format(ptree const& pt, Ctx& ctx) {
        return format_to(ctx.out(), "'{}'", pt.get_value<std::string>());
    }
};

int main() {
    ptree pt;
    pt.put("keyA", "valueA-1");
    pt.put("keyB", "valueB");
    pt.put("keyC", "valueC");

    pt.add("keyA", "valueA-2"); // not replacing same key
    
    std::map<std::string, ptree> m(pt.begin(), pt.end());
    std::multimap<std::string, ptree> mm(pt.begin(), pt.end());

    std::map<std::string, std::string> dict;
    for (auto& [k,v]: pt) {
        dict.emplace(k, v.get_value<std::string>());
    }

    fmt::print(
        "map:\n\t{}\n"
        "multimap:\n\t{}\n"
        "dict:\n\t{}\n",
        fmt::join(m, "\n\t"),
        fmt::join(mm, "\n\t"),
        fmt::join(dict, "\n\t")
    );
}
并列比较

ptree pt;

std::map<std::string, ptree> m(pt.begin(), pt.end());
#include <boost/property_tree/ptree.hpp>
#include <map>
#include <fmt/ranges.h>
using boost::property_tree::ptree;

template<> struct fmt::formatter<ptree> : fmt::formatter<std::string>
{
    template<typename Ctx>
    auto format(ptree const& pt, Ctx& ctx) {
        return format_to(ctx.out(), "'{}'", pt.get_value<std::string>());
    }
};

int main() {
    ptree pt;
    pt.put("keyA", "valueA-1");
    pt.put("keyB", "valueB");
    pt.put("keyC", "valueC");

    pt.add("keyA", "valueA-2"); // not replacing same key
    
    std::map<std::string, ptree> m(pt.begin(), pt.end());
    std::multimap<std::string, ptree> mm(pt.begin(), pt.end());

    std::map<std::string, std::string> dict;
    for (auto& [k,v]: pt) {
        dict.emplace(k, v.get_value<std::string>());
    }

    fmt::print(
        "map:\n\t{}\n"
        "multimap:\n\t{}\n"
        "dict:\n\t{}\n",
        fmt::join(m, "\n\t"),
        fmt::join(mm, "\n\t"),
        fmt::join(dict, "\n\t")
    );
}
奖励:从字符串字典中选择Ptree

模板
ptree ptree_from_地图(类似于地图的常量和m){
ptree-pt;
对于(自动常数和[k,v]:m){
增加(k,v)部分;
}
返回pt;
}

Post a和完整的未经编辑的错误消息。哦,注意到您也想要相反的消息:
map: 
        ("keyA", 'valueA-1')
        ("keyB", 'valueB')
        ("keyC", 'valueC')
multimap:
        ("keyA", 'valueA-1')
        ("keyA", 'valueA-2')
        ("keyB", 'valueB')
        ("keyC", 'valueC')
dict:
        ("keyA", "valueA-1")
        ("keyB", "valueB")
        ("keyC", "valueC")
template <typename MapLike>
ptree ptree_from_map(MapLike const& m) {
    ptree pt;
    for (auto const& [k,v]: m) {
        pt.add(k, v);
    }
    return pt;
}