我有A班 如何重载operator ==执行
A a,b,c;
if (a==b==c) {}
有人可以帮助我吗?
答案 0 :(得分:3)
非常简短的答案:不!
稍微长一点的答案:不要试试这个。
说明:每个C ++程序员都习惯让比较运算符返回bool或者可以转换为bool的东西。只是因为输入if (a==b)
之类的东西是很自然的
因此,如果表达式a==b
返回bool x
,那么a==b==c
将意味着将x
与c
进行比较。这毫无意义。即使你让它编译,例如比较这种方式,它不会产生你期望的结果。
所以,虽然技术上我可以想到你想要的解决方案(比较三者是否相等),但正确的做法是如何在C ++中完成它:逻辑链二进制比较:
if (a==b && b==c) {}
对于那些对“技术可行而且非常丑陋”的解决方案感到疑惑的人:
(请勿在现实世界中使用!如果你这样做,你应该被解雇。)
template <class T>
struct multiCompareProxy {
bool b;
T const& t;
explicit operator bool() const {return b;}
multiCompareProxy operator==(T const& rhs) {
return {b && t.equals(rhs), t};
}
};
template <class T>
multiCompareProxy<T> operator==(T const& lhs, T const& rhs) {
return {lhs.equals(rhs), lhs};
}
现在,一个班级必须重载euqals
方法才能实现此目的:Example
答案 1 :(得分:2)
如果由于某种原因你真的想要这样做,你需要一个像这样的代理对象:
struct A {};
struct Proxy {};
Proxy operator==(const A& a, const A& b) {
return {};
}
bool operator==(const Proxy& p, const A& b) {
return true;
}
bool operator==(const A& a, const Proxy& p) {
return true;
}
#include <iostream>
int main() {
A a, b, c;
if(a == b == c) {
std::cout << "Bad.\n";
}
}
但不这样做。像其他人一样使用(a == b) && (a == c)
。
答案 2 :(得分:2)
它可以完成,并且偶尔非常有用作为一种特定于域的语言(DSL)用于匹配非C ++程序员所期望的符号,但它应该我会刻意避免用于其他用途,因为如果不经常使用代码,它会使编程人员感到困惑(并烦恼)。
class A
{
// ...
bool equals(const A& rhs) const { return ... }
struct X
{
X(const A& a, bool b) : a_(a), b_(b) { }
X& operator==(const A& rhs) const { b_ &= a_.equals(rhs); return *this; }
explicit operator bool() const { return b_; }
// remove explicit pre C++11 / consider making it operator void*() ...
const A& a_;
mutable bool b_;
};
X A::operator==(const A& rhs) const
{
return X(*this, equals(rhs));
}
};
(如果你有隐式构造函数,你可能更喜欢独立函数。)
使用相同类型的代理hackery允许各种意想不到的符号,例如3 < x < 9
和x == a1 || a2 || a3
......再次避免使用它们,除非它对维护者产生巨大影响它们将被使用的代码(理想情况下,代码将与系统中的其他C ++代码具有非常明确的边界)。
作为这种技术的良好用途的一个例子,考虑一下激励精神库,以及它对许多运算符的不寻常使用,以提供近似于BNF符号的东西....
答案 3 :(得分:1)
你不能(减去丑陋的黑客的可能性)超载operator==(...)
按照你的指定工作。
如果你考虑它会做什么a == b
会成为真或假(bool),那么你会留下(<bool> == c)
。做你想要做的事的正确方法是某种形式的(a==b) && (b==c)
。
有些时候你可以重载操作符来按照你的描述工作,但它必须返回它所需的相同类型。一个例子是:
class A
{
A& operator+=(A const& rhs)
{
// operator logic
return *this;
}
}
此案例有效,因为使用a += b += c
,您将执行(b += c)
,这将返回A&
,其余a.operator+=(...)
接受为{{1}}。
答案 4 :(得分:0)
bool operator==(T const & a, T const & b) {
return /*boolean expr*/
}
如果你有课,你可以这样做:
class MyClass {
public:
bool operator==(T const & rhs) const {
return /*boolean expr*/
}
}
不要连续两次使用==,你不能这样做:
a == b && b == c
答案 5 :(得分:0)
我会写:
bool operator==(const A& lhs, const A& rhs){ /* do actual comparison */ }
并使用和操作两次。