C++等于(==)重载,快捷方式或比较所有属性的最佳方式

Meh*_*hno 31 c++ operator-overloading

我必须在C++中为具有许多属性的类重载一个==运算符.
当且仅当所有属性相等时,运算符才应返回true.如果这些属性随时间而变化,则快捷方式可能很有用,以避免错误.

是否有比较类中每个属性的快捷方式?

Bar*_*rry 40

没有捷径.你必须列出一切.

通过引入名为的成员函数可以减少一些错误来源tied():

struct Foo {
    A a;
    B b;
    C c;
    ...

private:
    auto tied() const { return std::tie(a, b, c, ...); }
};
Run Code Online (Sandbox Code Playgroud)

所以你operator==可以使用它:

bool operator==(Foo const& rhs) const { return tied() == rhs.tied(); }
Run Code Online (Sandbox Code Playgroud)

这使您只能列出所有成员一次.但那是关于它的.你仍然需要实际列出它们(所以你仍然可以忘记一个).


有一个提议(P0221R0)来创建默认值operator==,但我不知道它是否会被接受.


Nat*_*ica 16

从C++ 11开始,随着元组的引入我们也得到了std::tie().这将允许使用从一堆变量中创建一个元组,并针对所有变量调用一个比较函数.你可以像使用它一样

struct Foo
{
    int a,b,c,d,e,f;
    bool operator==(const Foo& rhs) { return std::tie(a,b,c,d,e,f) == std::tie(rhs.a,rhs.b,rhs.c,rhs.d,rhs.e,rhs.f); }
};
Run Code Online (Sandbox Code Playgroud)

您仍然需要列出要检查的所有成员,但这样可以更轻松.您也可以使用它来更轻松地进行比较和更大的比较.

还应注意,变量按照您提供的顺序进行检查tie.这对于小于和大于比较而言非常重要.

std::tie(a,b) < std::tie(rhs.a, rhs.b);
Run Code Online (Sandbox Code Playgroud)

不必一样

std::tie(b,a) < std::tie(rhs.b, rhs.a);
Run Code Online (Sandbox Code Playgroud)


Phi*_*ßen 5

目前,没有捷径,但有计划增加对它的支持(P0221R0).

Bjarne Stroustrup最近写了一篇关于它的博客文章: 默认比较提案的一些背景知识

在C++ 14中,没有比列出所有成员并进行比较更好的了,这很容易出错.引用Bjarne:

默认比较的杀手论证实际上不是方便,而是人们让他们的平等运算符错误的事实.