gpt4 book ai didi

c++ - 你如何确定你在 yaml-cpp 中处理的是哪种节点?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:42 49 4
gpt4 key购买 nike

我在这里阅读教程代码: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 block 的情况下确定我是在循环中处理序列还是映射(即我是否应该使用 ->first)?

我尝试查找文档,但找不到。

更新:

这就是我想要做的:

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。

最佳答案

你可以

switch (node.Type()) {
case Null: // ...
case Scalar: // ...
case Sequence: // ...
case Map: // ...
case Undefined: // ...
}

或明确查询,例如:

if (node.IsSequence()) {
// ...
}

(我在教程中添加了这一点。)

编辑:在您的特定示例中,您应该检查config.Type()您迭代之前,而不是任何迭代期间的节点。

关于c++ - 你如何确定你在 yaml-cpp 中处理的是哪种节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179726/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com