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]);