gpt4 book ai didi

c++ - 如何使用 boost C++ property map 从配置文件中提取值

转载 作者:行者123 更新时间:2023-11-30 03:32:23 25 4
gpt4 key购买 nike

我有一个这样的配置文件,其中 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 被存储到一个 vector 中,因此不可能获得每个 OBJECT 及其属性之间的映射。所以我认为 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);

我尝试使用属性映射,但它似乎不起作用...我认为让每个 OBJECT 成为一个节点,然后一条边到 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);

最佳答案

你弄错了图书馆。 Property Map 是一个通用的类似“lense”的库,用于根据某种输入参数访问(读/写)属性。

雪上加霜的是,代码示例(显然?)来自 Boost Graph,Boost Propery Map 的母库。

现在,您需要 boost 属性树。这些样本很容易找到,这里还有一个:

Live On 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')

关于c++ - 如何使用 boost C++ property map 从配置文件中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43480653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com