C++ 常量yaml cpp节点在多次使用时会发生更改
比如说,亚姆C++ 常量yaml cpp节点在多次使用时会发生更改,c++,yaml-cpp,C++,Yaml Cpp,比如说,亚姆 aaa: bbb: ccc: testOne ddd: testTwo 目标是找到给定参数路径的值,例如aaa/bbb/ccc。当我尝试这样做两次时,虽然传递了一个const YAML::Node,但父aaa会更改并指向我上次搜索的位置。 我知道YAML::Nodes只是一个浅层结构,因此我的操作显然改变了底层数据。在不更改输入数据的情况下浏览树的最佳方式是什么 有关更多详细信息,请参见我的带有一些调试输出的最小示例: std::strin
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;
}
但是我觉得这可以做得更好。在yaml cpp中,
操作符=
指定一个参考值。这有点不直观;参见讨论问题
相反,请调用Node::reset
:
childNode.reset(parentNode[childNodeName]);
大概
findNodeInYAMLTree(const YAML::Node Node,
应该是findNodeInYAMLTree(const YAML::Node&Node,
?可能会将parentNode
和childNode
更改为指针?我猜childNode=parentNode[childNodeName]
正在复制parentNode[childNodeName]的内容
进入childNode
,对于一个库来说这不是一件非常友好的事情,因为引用YAML::Node&Node传递没有帮助。YAML::Node不过是一个bool和两个指针而已。我无法编写指针版本,因为编译器出现了“获取临时地址”的错误。运算符[]在parentNode中[childNodeName]在该作用域中创建一个节点()。我想这不是办法,因为parentNode[childNodeName]是唯一可以更改输入数据的操作,但在使用指针时不会被替换。谢谢@AlanBirtlesunintuitive.true;)这可能需要更好的文档(doxygen api?),因为你的库有很好的功能,但可用性有点落后。为积极支持这里而干杯。
YAML::Node parentNode = YAML::Clone(node);
childNode.reset(parentNode[childNodeName]);