复制语义和比较
Copy Semantics and Comparison
anq">有没有办法将 YAML::Node 对象中的所有值复制到新对象(即克隆)中?还有没有办法通过节点中的值(即 .equals() 函数而不是 .is() 函数)来测试两个 YAML::Node 对象之间的相等性?
请考虑以下示例:
YAML::Node a;
a["x"][1]["y"][2]["z"][3] = 1;
std::cout << "A_____n" << a << "nnnn";
std::cout << "Test 1n";
YAML::Node z = a["x"][1]["y"][2]["z"];
z[3] = 2;
std::cout << "Z_____n" << z << "n";
std::cout << "A_____n" << a << "nnnn";
std::cout << "Test 2n";
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 << "nnnn";
std::cout << "Test 3n";
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"]) << "nn";
运行时输出以下内容:
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)
为真。
要深层复制节点:
YAML::Node node = /* ... */;
YAML::Node other = Clone(node);
(这现已实现;您可以看到旧的错误报告。
当前行为是有意的(换句话说,典型的"副本"只是设置标识),不会更改。
至于平等,一般来说,对于YAML来说,这是一个非常困难的问题。在yaml-cpp项目页面上有一些关于这个问题的讨论。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么比较运算符如此快速
- 何时在引用或唯一指针上使用移动语义
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 如何从具有移动语义的类对象中生成共享指针
- 比较字符数组
- 将模板化的类型与C++中的某些类/类型进行比较
- Boost Spirit,获取迭代器内部语义动作
- C++自定义比较函数
- 如何比较自定义类的std::变体
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- std::设置自定义比较器
- 布尔比较运算符是如何在C++中工作的
- C++将目录中的所有文件与::filesystem进行比较
- shell排序中的交换和比较
- 如何在C++中比较两个char数组
- catch框架有没有办法比较流或文件
- C++11比较和交换获取/释放语义
- 复制语义和比较
- 将语义与std::原子类型进行比较