使用等于运算符会想到,但是您需要定义它,这意味着每次将新数据成员添加到该类时都要更新它。这需要对正在检查的所有类进行。还有其他好办法吗?
答案 0 :(得分:4)
对于任何复杂到足以管理自己资源的事情,您都需要一个等于运算符。没有良好的自动比较方式。按位比较适用于POD类型,但没有别的。任何指针成员都可能指向不同的地址,即使该对象在逻辑上似乎是克隆 1 。此外,标准对类的内存布局并不十分具体,因此即使缺少指针和虚函数,它也可能会失败(或者至少它可能是UB)。
1。我认为比较是复杂对象的基本逻辑运算。 POD类型恰好是按位可比的,因为它们是相等的,如果它们是按位相等的。
答案 1 :(得分:1)
有很多行动需要平局。
在C ++ 14中,很容易得到一个。
struct foo {
template<class Self> // may have template and friend reversed
friend auto make_tie(Self&&self){
return std::tie(self.a,self.b,self.c);
}
// ...
使用make_tie
,<
==
hash
swap
print
(可能还有其他人,例如serialize
,但序列化除外需要版本控制)都可以写一次,并适用于多种类型。
您必须维护make_tie
才能实现此目的。 C ++ 1z轨道中的反射工作组正致力于增加可能使make_tie
需要较少维护的语言。
但至少你会从一个额外的成员变量列表中获得许多操作(一些有用的)。
如果您的指针是智能的,那么它会有所帮助 - 如果您的指针是值语义,==
应该比较值,如果共享,==
应该比较身份,如果是唯一的,==
应该做的。非默认克隆操作将需要非默认的==
:将非默认副本推送到资源管理类并将==
逻辑放在那里。
答案 2 :(得分:0)