1

私のニーズに完全に適合するため、C++ プロジェクトで yaml-cpp を無意識に使用したいと考えています。しかし、あるノードを別のノードから更新したい。つまり、存在しないノードをあるモードから別のモードに適切に追加したり、既存のノードの既存の値を置き換えたりしたい。現在のインターフェースで簡単にこれを行う方法が見つかりません...

そのため、イテレータで単純なループを使用してこれを実行しようとしています。マップノードをトラバースしている間、次のことが機能しないことがわかりました。

if (node_1[it->first]) /*...*/

ノードが見つかりません。そのため、スカラーをキーとして持つマップ ノードの場合、テストif (node_1[it->first.Scalar()]) /*...*/はうまく機能します。私の問題は、シーケンスキーで同じことをすることです。どうやってやるの?

編集

YAML ドキュメントの例を次に示します。

---
#Fake entry
Time:   0.1.1.2
ID: 25814
Emitter: Me
Line : {
    orig: 314,
    st: 512
  }
Message : |
    This is a fake error

#More difficult
[0,1,2,3] : my_address
[5, 6, 7, 8] : an_address
...

このドキュメントは問題なくノード (doc1 など) にロードされます。次のような、別の YAML ドキュメントに関していくつかのエントリを変更したいと思います。

---
Comment: what a dummy file!
Emitter: You
[0,1,2,3] : address changed
...

したがって、この 2 番目のドキュメントをノード doc2 にロードし、ドキュメント 2 のノードで doc1 を更新したいと考えています。ドキュメント 2 の最初のキーはドキュメント 1 には存在せず、スカラーであるため、実行できますdoc1[it->first.Scalar()] = it->second。2 番目のキーが存在するため、同じ命令で doc1 が更新され、 key にリンクされた値が置き換えられますEmitter。私の問題は、シーケンスであるため、doc1 内の 3 番目のキーを見つけることができないことです。

4

1 に答える 1

1

yaml-cpp はノードの一般的な等価性テストを提供していないため、最初のソリューション (これが最善の方法です) が機能しませんでした。

代わりに、yaml-cpp は型指定された等価性テストに依存しています。たとえば、node[5]すべてのキーを整数に変換して、キーの同等性をチェックします。ノードに変換せず5、その方法で同等性をチェックします。これが、他のソリューションが通常機能する理由です。ほとんどのキーは単純なスカラーであるため、std::string同等性を使用して一致させることができます。

本当に 2 つのノードを「マージ」したいようです。これはしばらくの間 yaml-cpp の問題リストにありました: https://code.google.com/p/yaml-cpp/issues/detail?id=41、そしてそれが難しい問題である理由を説明するいくつかの議論があります.

可能な回避策として、各ノードのタイプがわかっている場合は、比較を行う前に明示的にキャストできます。次に例を示します。

doc1[it->first.as<T>()] = it->second;
于 2013-09-03T13:31:11.957 に答える