有没有办法将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
吗?在test3中,
c
中的值与a
中的值相同。是否有某种方法可以对YAML::Node对象执行a.equals(c)
来测试两个节点中的值是否全部相同?在示例中,a.equals(c)
为true。 最佳答案
要深度复制节点:
YAML::Node node = /* ... */;
YAML::Node other = Clone(node);
(现在已实现;您可以看到旧的bug report。)
当前行为是有意的(换句话说,典型的“副本”只是设置身份),并且不会改变。
对于平等,通常对于YAML来说,这是一个非常困难的问题。 yaml-cpp项目页面上的this issue上有一些讨论。
关于c++ - 复制语义和比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11129234/