2

反復せずにYAML-cppを使用してマップ内のキーを取得する簡単な方法はありますか?指示first()から、YAML-cppイテレータクラスのメソッドを使用できることがわかりますが、実際に反復する必要はありません。インデントレベルで識別できるキーがありますが、キーが既知のリストの1つでない場合は、例外をスローする必要があります。私のコードは現在次のようになっています:

std::string key;
if (doc.FindValue("goodKey")
{
    // do stuff
    key = "goodKey";
} else if (doc.FindValue("alsoGoodKey") {
    // do stuff
    key = "alsoGoodKey";
} else throw (std::runtime_error("unrecognized key"); 

// made it this far, now let's continue parsing
doc[key]["otherThing"] >> otherThingVar;
// etc.

otherThingはYAMLファイルのgoodKeyの下にあるため、解析を続行するにはキー文字列が必要です。これは問題なく機能しますが、認識されないキーが何であるかをユーザーに伝えたいと思います。でも、どうやってアクセスしたらいいのかわかりません。その値を与える関数がヘッダーファイルに表示されません。どうすれば入手できますか?

4

1 に答える 1

1

「認識されないキー」は必ずしも1つではありません。たとえば、YAMLファイルは次のようになります。

someKey: [blah]
someOtherKey: [blah]

または、空の場合もあります。たとえば、{}。前者の場合、どちらにしますか?後者の場合、キーはありません。

「マップ内のキーを取得する」方法を求めていますが、マップには0個以上のキーを含めることができます。

FindValueちなみに、取得したキーの名前が実際には必要ない場合は、の実際の結果を使用して、この一部を簡略化できます。例えば:

const YAML::Node *pNode = doc.FindValue("goodKey");
if(!pNode)
   pNode = doc.FindValue("alsoGoodKey");
if(!pNode)
   throw std::runtime_error("unrecognized key");

(*pNode)["otherThing"] >> otherThingVar;
// etc
于 2012-11-06T18:54:00.073 に答える