Я начинаю использовать YAML и библиотеку yaml-cpp для интерпретации моего файла.Я расширил пример "монстров" с некоторой информацией из моего собственного проекта.Код и файл yaml приведены ниже, но сначала у меня возник вопрос:
Нужно ли размещать все данные, которые я буду получать из проекта, в одну массивную структуру?В примере с монстрами считывать значения из документа doc [i] было легко, потому что это был список монстров.В моем примере у меня будет несколько списков, но также и скаляры и т. Д. Единственный способ, который я нашел для этого, состоит в том, чтобы создать список, который технически имеет только одну запись (т. Е. В верхней части находится один знак «-»).файла, и все с отступом в блок).Я думаю, что ответ состоит в том, чтобы взять часть содержимого версии оператора «loadformulation» перегруженного >> оператора, но я не мог заставить его работать должным образом, не имея этого содержимого внутри этой функции.Мы ценим любую помощь или совет.
ea_test.cpp:
#include "yaml-cpp/yaml.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
struct Vec2{
double x, y;
};
struct DecVar{
std::string name;
std::string tag;
Vec2 range;
std::string description;
};
struct ProblemFormulation{
std::vector <DecVar> decvars;
int numrealizations;
};
void operator >> (const YAML::Node& node, Vec2& v) {
node[0] >> v.x;
node[1] >> v.y;
}
void operator >> (const YAML::Node& node, DecVar& decvar){
node["name"] >> decvar.name;
node["tag"] >> decvar.tag;
node["range"] >> decvar.range;
node["description"] >> decvar.description;
}
void operator >> (const YAML::Node& node, ProblemFormulation& problemformulation){
node["realizations"] >> problemformulation.numrealizations;
std::cout << " read realizations!" << std::endl;
const YAML::Node& decvarNode = node["decisions"];
for (unsigned int i = 0; i < decvarNode.size(); i++)
{
DecVar decvar;
decvarNode[i] >> decvar;
problemformulation.decvars.push_back(decvar);
}
}
int main()
{
std::ifstream fin("./ea.yaml");
YAML::Parser parser(fin);
YAML::Node doc;
parser.GetNextDocument(doc);
std::cout << "entering loop" << std::endl;
ProblemFormulation problemformulation;
for (unsigned int i = 0; i < doc.size(); i++)
{
doc[i] >> problemformulation;
}
return 0;
}
И, ea.yaml:
-
realizations: 10
decisions:
- name: reservoir
tag: res_tag
range: [0, 1.0]
description: >
This is a description.
- name: flow
tag: flow_tag
range: [0, 2.0]
description: >
This is how much flow is in the system.
Заранее благодарим за помощь и советы!
Редактировать: Вероятно, я буду работать только с одним документом yaml, и когда-либо будет создан только один объект формирования проблемы.Мой код адаптирует то, что вы делаете для списка, но делает это только один раз.Я хотел бы знать правильный способ, «просто сделайте это один раз», так как я думаю, что это было бы чище и сделало бы файл YAML лучше выглядящим (без всяких вещей с отступом в один блок без причины).