Советы по проектированию структур данных для взаимодействия с yaml-cpp?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Советы по проектированию структур данных для взаимодействия с yaml-cpp?

Сообщение Anonymous »

Я начинаю использовать YAML и библиотеку yaml-cpp для интерпретации моего файла. Я дополнил пример «монстров» информацией из моего собственного проекта. Код и файл yaml приведены ниже, но сначала у меня вопрос:
Нужно ли помещать все данные, которые я буду получать из проекта, в одну массивную структуру? В примере с монстрами прочитать значения из документа doc было легко, поскольку это был список монстров. В моем примере у меня будет несколько списков, а также скаляры и т. д. Единственный способ, который я нашел, — это создать список, который технически содержит только одну запись (т. е. в верхней части файла есть один «-», и все находится в блоке). Я думаю, что ответ состоит в том, чтобы взять часть содержимого версии «формулировки проблемы» перегруженного оператора >>, но я не смог заставить его работать должным образом, не имея этого содержимого внутри этой функции. Любая помощь или совет приветствуются.
ea_test.cpp:

Код: Выделить всё

#include 
#include 
#include 
#include 

#include "yaml-cpp/yaml.h"

struct Vec2 {
double x, y;
};

struct DecVar {
std::string name;
std::string tag;
Vec2 range;
std::string description;
};

struct ProblemFormulation {
std::vector 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  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  problemformulation;
}
return 0;
}
И, ea.yaml:

Код: Выделить всё

- realizations: 10
decisions:
- name: reservoir
tag: res_tag
range:
- 0
- 1
description: |
This is a description.
- name: flow
tag: flow_tag
range:
- 0
- 2
description: |
This is how much flow is in the system.
Заранее спасибо за вашу помощь и советы!
Изменить: я, вероятно, буду запускать только один документ yaml, и когда-либо будет создан только один объект формулировки задачи. Мой код адаптирует то, что вы делаете со списком, но делает это только один раз. Я хотел бы знать, как правильно «просто сделать это один раз», так как я думаю, что это будет чище и сделает YAML-файл более привлекательным (без всяких отступов в один блок без причины).

Подробнее здесь: https://stackoverflow.com/questions/921 ... h-yaml-cpp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»