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)
目前,没有捷径,但有计划增加对它的支持(P0221R0).
Bjarne Stroustrup最近写了一篇关于它的博客文章: 默认比较提案的一些背景知识
在C++ 14中,没有比列出所有成员并进行比较更好的了,这很容易出错.引用Bjarne:
默认比较的杀手论证实际上不是方便,而是人们让他们的平等运算符错误的事实.
归档时间: |
|
查看次数: |
2211 次 |
最近记录: |