如何使用Boost C 属性映射从配置文件中提取值



i有这样的配置文件,其中 properties1可以具有1个或更多值:

[OBJECT]
properties1=val1, val2, val3
porperty2=Blah
property3=Blah
property4=Blah
porperty5=Bla bla bla
[OBJECT]
properties1=val1
porperty2=Blah
property3=Blah
property4=Blah
porperty5=Bla bla bla

我正在使用boost::program_options解析。但是,它无法正常工作,因为例如properties1被存储到一个向量中,因此无法在每个对象及其属性之间进行映射。因此,我认为boost::property_map可能是一个很好的解决方案。这是当前的解决方案:

  namespace po = boost::program_options;
  std::vector<std::string> properties1_all;
  std::vector<std::string> property2_all;
  std::vector<std::string> property3_all;
  std::vector<std::string> property4_all;
  std::vector<std::string> property5_all;
  po::options_description desc;
  desc.add_options()
      ("OBJECT.properties1",
      po::value<std::vector<std::string> >(&properties1_all))
      ("OBJECT.property2",
      po::value<std::vector<std::string> >(&property2_all))
      ("OBJECT.property3",
      po::value<std::vector<std::string> >(&property3_all))
      ("OBJECT.property4",
      po::value<std::vector<std::string> >(&property4_all))
      ("OBJECT.property5",
      po::value<std::vector<std::string> >(&property5_all));
  po::variables_map vm;
  std::ifstream settings_file("config.ini", std::ifstream::in);
  po::store(po::parse_config_file(settings_file, desc), vm);
  settings_file.close();
  po::notify(vm);

和我对属性图的尝试似乎不起作用...我认为使每个对象成为一个节点,然后将每个对象的边缘到5个顶点,这是其属性,将是一个很好的解决方案:

 typedef adjacency_list<vecS, vecS, bidirectionalS, 
    no_property, property<edge_index_t, std::size_t> > Graph;
  const int num_vertices = 5;
  Graph G(num_vertices);
  int propertyarray[] = { 1, 2, 3, 4, 5 };
  int objectarray[] = { 1, 2, 3 };
  // Add edges to the graph, and assign each edge an ID number.
  add_edge(0, 1, 0, G);
  // ...
  typedef graph_traits<Graph>::edge_descriptor Edge;
  typedef property_map<Graph, edge_index_t>::type EdgeID_Map;
  EdgeID_Map edge_id = get(edge_index, G);

您的库错了。属性映射是基于某种输入参数的通用"镜头"库,用于访问(读/写(属性。

为了增加侮辱性伤害,代码样本是(显然?(来自Boost Graph,Boost Graph是Boost Propery Map诞生的。

现在,您想要Boost属性树。样品很容易找到,这里还有一个:

活在coliru

#include <iostream>
#include <map>
#include <boost/property_tree/ini_parser.hpp>
static std::string const sample = R"(
[BLA]
properties1=val1, val2, val3
property2=Blah
property3=Blah
property4=Blah
property5=Bla bla bla
[BLO]
properties1=val1
property2=Blah
property3=Blah
property4=Blah
property5=Bla bla bla
)";
struct Object {
    std::string properties1, property2, property3, property4, property5;
};
using boost::property_tree::ptree;
void read(ptree const& pt, std::string& s) {
    s = pt.get_value(s);
}
void read(ptree const& pt, Object& object) {
    read(pt.get_child("properties1"), object.properties1);
    read(pt.get_child("property2"), object.property2);
    read(pt.get_child("property3"), object.property3);
    read(pt.get_child("property4"), object.property4);
    read(pt.get_child("property5"), object.property5);
}
template <typename T>
T read_as(ptree const& pt) {
    T v;
    read(pt, v);
    return v;
}
int main() {
    std::istringstream iss(sample);
    boost::property_tree::ptree config;
    read_ini(iss, config);
    std::map<std::string, Object> parsed;
    for (auto& section : config) {
        parsed[section.first] = read_as<Object>(section.second);
    }
    for (auto& object : parsed) {
        std::cout << "Parsed object named " << object.first << " (e.g. property5 is '" << object.second.property5 << "')n";
    }
}

打印:

Parsed object named BLA (e.g. property5 is 'Bla bla bla')
Parsed object named BLO (e.g. property5 is 'Bla bla bla')

最新更新