我想在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个键,因为它是一个序列。
答案 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;