对于.yaml,说
aaa:
bbb:
ccc: testOne
ddd: testTwo
目标是找到给定参数路径的值,例如aaa / bbb / ccc。当我尝试执行两次此操作时,尽管传递了const YAML :: Node,但父aaa却被更改并指向我上次搜索的位置。 我了解YAML :: Nodes只是一个浅层结构,因此我的操作显然正在更改基础数据。在不更改输入数据的情况下浏览树的整洁方法是什么?
有关更多详细信息,请参见带有调试输出的最小示例:
std::string findNodeInYAMLTree(const YAML::Node node, const std::vector<std::string> &pathInTree)
{
std::cout << "Input root node for findNodeInYAMLTree():" << std::endl;
for (const auto& kv : node) {
std::cout << kv.first.as<std::string>() << "\n";
}
YAML::Node parentNode = node;
YAML::Node childNode = parentNode;
std::vector<std::string>::const_iterator it = pathInTree.begin();
while (it != pathInTree.end()) {
std::string childNodeName = *it;
if (!parentNode.IsDefined() || !parentNode[childNodeName]) {
std::cout << "Did not find the next tree path node <" << childNodeName << ">" << std::endl;
return "Failure";
}
childNode = parentNode[childNodeName];
parentNode = childNode;
it++;
}
return childNode.as<std::string>();
}
void testSameFctTwice()
{
YAML::Node aaa;
YAML::Node node = YAML::Load("aaa: {bbb: {ccc: testOne, ddd: testTwo}}");
std::vector<std::string> testOneStr({"aaa", "bbb","ccc"});
std::cout << findNodeInYAMLTree(node, testOneStr) << std::endl;
std::vector<std::string> testTwoStr({"aaa", "bbb", "ddd"});
std::cout << findNodeInYAMLTree(node, testTwoStr) << std::endl;
}
我正在使用系统存储库的版本0.5.2,将yaml-cpp临时更新为0.6 / HEAD并没有改变。
输出将是:
Input root node for findNodeInYAMLTree():
aaa
testOne
Input root node for findNodeInYAMLTree():
ddd
ccc
Did not find the next tree path node <aaa>
Failure
因此解决方法是:
YAML::Node parentNode = YAML::Clone(node);
但是我觉得这可以做得更好。
答案 0 :(得分:0)
在yaml-cpp中,operator =
分配一个参考值。这有点不直观。请参阅this issue讨论问题。
相反,请致电Node::reset
:
childNode.reset(parentNode[childNodeName]);