如何重载operator ==?

时间:2014-03-27 07:25:59

标签: c++ overloading operator-keyword

我有A班 如何重载operator ==执行

A a,b,c;
if (a==b==c) {}

有人可以帮助我吗?

6 个答案:

答案 0 :(得分:3)

非常简短的答案:不!
稍微长一点的答案:不要试试这个。

说明:每个C ++程序员都习惯让比较运算符返回bool或者可以转换为bool的东西。只是因为输入if (a==b)之类的东西是很自然的 因此,如果表达式a==b返回bool x,那么a==b==c将意味着将xc进行比较。这毫无意义。即使你让它编译,例如比较这种方式,它不会产生你期望的结果。

所以,虽然技术上我可以想到你想要的解决方案(比较三者是否相等),但正确的做法是如何在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 < 9x == 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 */ }

并使用和操作两次。