复制语义和比较

3
有没有办法将YAML :: Node对象中的所有值复制到新对象(即克隆)中?此外,有没有一种方法按节点中的值测试两个YAML :: Node对象之间的相等性(即.equals()函数而不是.is()函数)?
考虑以下示例:
YAML::Node a;
a["x"][1]["y"][2]["z"][3] = 1;
std::cout << "A_____\n" << a << "\n\n\n\n";

std::cout << "Test 1\n";
YAML::Node z = a["x"][1]["y"][2]["z"];
z[3] = 2;
std::cout << "Z_____\n" <<  z << "\n";
std::cout << "A_____\n" <<  a << "\n\n\n\n";

std::cout << "Test 2\n";
YAML::Node b = a;
b["x"][1]["y"][2]["z"][3] = 3;
std::cout << "B_____\n" <<  b << "\n";
std::cout << "Z_____\n" <<  z << "\n";
std::cout << "A_____\n" <<  a << "\n\n\n\n";

std::cout << "Test 3\n";
YAML::Node c;
c["x"][1]["y"][2]["z"][3] = 3;
std::cout << "C_____\n" <<  c << "\n";
std::cout << "A_____\n" <<  a << "\n";
std::cout << "a == c: " <<  bool(a==c) << "\n";
std::cout << "z == a[\"x\"][1][\"y\"][2][\"z\"]: "
            <<  bool(z == a["x"][1]["y"][2]["z"]) << "\n\n";

当运行时,该程序会输出以下内容:
A_____
x:
  1:
    y:
      2:
        z:
          3: 1



Test 1
Z_____
3: 2
A_____
x:
  1:
    y:
      2:
        z:
          3: 2



Test 2
B_____
x:
  1:
    y:
      2:
        z:
          3: 3
Z_____
3: 3
A_____
x:
  1:
    y:
      2:
        z:
          3: 3



Test 3
C_____
x:
  1:
    y:
      2:
        z:
          3: 3
A_____
x:
  1:
    y:
      2:
        z:
          3: 3
a == c: 0
z == a["x"][1]["y"][2]["z"]: 1

在测试1中,修改z也会修改a["x"][1]["y"][2]["z"]的值。类似地,在测试2中,修改b相当于修改a。这些复制语义是否被认为是API的一部分(即它们将来可能会改变)?我想能够编写如下代码:z = getZ(),并且getZ()返回a["x"][1]["y"][2]["z"]("x"、"y"和"z"的名称可能会在将来更改)。然后修改z将会像示例中所示修改a
此外,有没有一种方法可以将a的克隆放入一个新对象b中,以便修改b不会同时修改a
在测试3中,c中的值与a中的值相同。是否有一种通用的方法来测试YAML :: Node对象的a.equals(c),以测试两个节点中的值是否完全相同?在此示例中,a.equals(c)将为true。
1个回答

1

深度复制一个节点:

YAML::Node node = /* ... */;
YAML::Node other = Clone(node);

这已经实现了,您可以查看旧的错误报告

当前行为是有意的(换句话说,典型的“复制”只是设置身份),并且不会更改。

至于相等性,在一般情况下对于YAML来说是一个非常困难的问题。在yaml-cpp项目页面上有关于此问题的讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接