获取密钥而不在YAML-cpp中迭代

时间:2012-11-06 17:48:33

标签: yaml-cpp

有没有一种简单的方法可以在不使用迭代的情况下使用YAML-cpp在地图中获取密钥?我在说明中看到我可以使用YAML-cpp迭代器类的first()方法,但我不需要实际迭代。我有一个密钥,我可以通过缩进级别识别,但我现在需要做的是如果密钥不是已知列表之一则抛出异常。我的代码目前看起来像这样:

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下。这工作正常,但我想告诉用户无法识别的密钥是什么。但是,我不知道如何访问它。我没有在头文件中看到任何给我这个值的函数。我怎么得到它?

1 个答案:

答案 0 :(得分:0)

没有一个“无法识别的密钥”。例如,您的YAML文件可能如下所示:

someKey: [blah]
someOtherKey: [blah]

或者它甚至可能是空的,例如{}。在前一种情况下,你想要哪一个?在后一种情况下,没有钥匙。

您正在询问如何“在地图中获取密钥”,但地图可以包含零个或多个密钥。

作为旁注,您可以使用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