私はYAMLとyaml-cppライブラリを使って私のファイルをintepretにし始めています。自分のプロジェクトの情報を使って、「モンスター」の例を拡張しました。コードとyamlファイルは以下のとおりですが、私の質問が最初にあります:yaml-cppとインターフェースするデータ構造の設計のヒント?
私がプロジェクトから抜け出すすべてのデータを1つの巨大な構造に配置する必要はありますか?モンスターの例では、ドキュメントdoc [i]から値を読み込むのは、それがモンスターのリストだったので簡単でした。私の例では、いくつかのリストだけでなく、スカラーなども持っています。これを行うために見つけた唯一の方法は、技術的に1つのエントリしか持たないリストを作ることです(つまり、すべてがブロックにインデントされています)。答えは、オーバーロードされた>>演算子の 'problemformulation'バージョンの内容の一部を取ることだと思いますが、その関数内にその内容を持たずに正しく動作するようにはできませんでした。どんな助けやアドバイスも感謝しています。
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.
ありがとう!
編集:私はたぶん1つのyaml文書しか実行していないでしょうし、これまでに作成される問題は1つだけです。私のコードはあなたがリストのためにやることに適応しますが、それは一度だけです。私はそれがきれいになり、より見栄えの良いYAMLファイルを作ることができると思うので、 "一度やりなさい"という正しい方法を知りたいと思います。
ありがとうございました。私はおそらく、より多くの質問をしますが、後で完全な別の投稿としてそれらを書くでしょう。 – Joe