如何使用键而不是标量来检索地图节点?

时间:2013-09-03 09:29:11

标签: c++ yaml-cpp

我想在C ++项目中使用密集的yaml-cpp,因为它完全符合我的需求。但我想从另一个节点更新一个节点,即正确地将不存在的节点从一种模式添加到另一种模式,或者替换现有节点的现有值。我无法通过当前界面找到如何做到这一点...

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

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

找不到任何节点!因此,对于以标量为键的地图节点,测试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
...

这个文档没有任何问题加载到Node中,比如说doc1;我现在想要修改一些关于另一个YAML文档的条目,例如:

---
Comment: what a dummy file!
Emitter: You
[0,1,2,3] : address changed
...

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

1 个答案:

答案 0 :(得分:1)

yaml-cpp不提供节点的通用等式测试,这就是为什么你的初始解决方案(最好的工作方式)不起作用的原因。

相反,yaml-cpp依赖于类型相等性测试。例如,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;