gpt4 book ai didi

c++ - 复制语义和比较

转载 作者:太空狗 更新时间:2023-10-29 23:07:56 27 4
gpt4 key购买 nike

有没有办法将 YAML::Node 对象中的所有值复制到新对象(即克隆)中?还有一种方法可以通过节点中的值(即 .equals() 函数而不是 .is() 函数)来测试两个 YAML::Node 对象之间的相等性吗?

考虑以下示例:

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 就不会同时修改一个?

在test3中,c中的值与a中的值相同。有什么方法可以为 YAML::Node 对象执行 a.equals(c) 来测试两个节点中的值是否都相同?在示例中,a.equals(c) 将为真。

最佳答案

要深复制一个节点:

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

(现在已实现;您可以看到旧的 bug report。)

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

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

关于c++ - 复制语义和比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com