我在这里阅读教程代码:https://code.google.com/p/yaml-cpp/wiki/Tutorial
一个例子是这样的:
YAML::Node primes = YAML::Load("[2, 3, 5, 7, 11]");
for (YAML::const_iterator it=primes.begin();it!=primes.end();++it) {
std::cout << it->as<int>() << "\n";
}
接下来就是这样:
YAML::Node lineup = YAML::Load("{1B: Prince Fielder, 2B: Rickie Weeks, LF: Ryan Braun}");
for(YAML::const_iterator it=lineup.begin();it!=lineup.end();++it) {
std::cout << "Playing at " << it->first.as<std::string>() << " is " << it->second.as<std::string>() << "\n";
}
但是,如果在这两种情况之间交换YAML文件,则会出现错误,因为您正在访问序列的映射迭代器,反之亦然:
terminate called after throwing an instance of 'YAML::InvalidNode'
what(): yaml-cpp: error at line 0, column 0: invalid node; this may result from using a map iterator as a sequence iterator, or vice-versa
对于任意YAML输入,如何在不使用try / catch块的情况下确定我是在处理循环中的序列还是映射(即我是否应该使用 - >首先与否)?
我尝试寻找文档,但我找不到它。
更新:
这就是我想要做的事情:
YAML::Node config = YAML::LoadFile(filename);
for (YAML::const_iterator it=config.begin();it!=config.end();++it) {
if (it->Type() == YAML::NodeType::Map) { // exception
std::cout << it->first.as<std::string>();
} else if (it->Type() == YAML::NodeType::Sequence) {
std::cout << it->as<std::string>();
}
}
但是当我运行代码时,我得到了如上所述的异常。它汇编得很好。
我正在使用ubuntu 14.04(0.5.1)附带的yaml-cpp。
答案 0 :(得分:2)
你可以
switch (node.Type()) {
case Null: // ...
case Scalar: // ...
case Sequence: // ...
case Map: // ...
case Undefined: // ...
}
或明确查询,例如:
if (node.IsSequence()) {
// ...
}
(我将这一点添加到教程中。)
编辑:在您的具体示例中,您应该在迭代之前检查config.Type()
,而不是迭代期间任何节点的类型。