c++ - 如何使用键而不是标量检索 map 节点?

标签 c++ yaml-cpp

我想在 C++ 项目中不敏感地使用 yaml-cpp,因为它完全符合我的需求。但是我想从另一个节点更新一个节点,即将不存在的节点从一种模式正确添加到另一种模式,或者替换现有节点的现有值。我找不到如何使用当前界面简单地执行此操作...

所以我尝试在迭代器上使用一个简单的循环来做到这一点。我发现在遍历 map 节点时以下内容不起作用:

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

它没有找到任何节点!因此,对于以标量作为键的 map 节点,测试 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
...

所以我将第二个文档加载到节点 doc2 中,我想用 doc 2 的节点更新 doc1。doc 2 的第一个键不存在于 doc 1 中并且是一个标量,所以我可以做 doc1[it->first.Scalar()] = it->second。第二个 key 存在,因此相同的指令将更新 doc1,替换与 key Emitter 链接的值。我的问题是我无法在 doc1 中成功找到第三个键,因为它是一个序列。

最佳答案

yaml-cpp 不为节点提供通用的相等性测试,这就是为什么您的初始解决方案(最有效的解决方案)不起作用的原因。

相反,yaml-cpp 依赖于typed 相等性测试。例如,node[5] 会将所有键转换为整数以检查键是否相等;它不会将 5 转换为节点,然后以这种方式检查相等性。这就是为什么您的其他解决方案通常会起作用的原因 - 大多数键都是简单的标量,因此它们可以使用 std::string 相等性进行匹配。

看来您确实想“合并”两个节点;这已经在 yaml-cpp 问题列表中出现了一段时间:https://code.google.com/p/yaml-cpp/issues/detail?id=41 ,那里有一些讨论解释了为什么这是一个难题。

作为一种可能的解决方法,如果您知道每个节点的类型,您可以在进行比较之前显式转换,例如:

doc1[it->first.as<T>()] = it->second;

关于c++ - 如何使用键而不是标量检索 map 节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18588709/

相关文章:

c++ - CImg get_crop() 返回错误的像素/获取 CImg 的子图像

c++ - 在插入时保持 std vector/列表排序,或对所有排序

C++ YAML : How to edit/write to a node in a . yaml文件

解析 yaml-cpp 中的注释

c++ - 使用 yaml 有困难

c++ - 在不违反信息隐藏的情况下重载流插入?

c++使用类来计算文件中的行数

c++ - 检查堆栈 C++ 中的最小值

c++ - 如何改进此模板以在 VS2012 中接受 lambda

c++ - 使用yaml-cpp错误解析YAML文件