如何重载==运算符以允许它用于多重比较?

时间:2010-10-23 18:35:08

标签: c++ operator-overloading

我正在尝试重载==运算符来比较下面的对象。

class A
{
    int a;
public:
    A(int x) { a = x; }
    bool operator==(const A& obRight)
    {
        if(a == obRight.a)
        {
            return true;
        }
        return false;
    }
};

int main()
{
    A ob(10), ob2(10), ob3(10);
    if(ob == ob2) // This equality comparison compiles fine.
        cout<<"Equal"<<endl;
     if(ob == ob2 == ob3) //This line doesn't compile as overloaded 
                          // == operator doesn't return object (returns bool)
           cout<<"Equal"<<endl;
}

如上所述,我无法在一行中进行多个对象比较 像if(ob == ob2 == ob3)使用重载==运算符通过成员函数。

我应该使用友方功能过载吗?

3 个答案:

答案 0 :(得分:11)

没有。你从根本上误解了你的行为。

if (ob == ob2 == ob3) =
if (ob == (ob2 == ob3)

考虑类型。

if (A == (A == A))
if (A == bool) // Oh dear, no == operator for bool!

你需要

if ((ob == ob2) && (ob == ob3))
if ((A == A) && (A == A))
if (bool && bool) // fine

答案 1 :(得分:11)

通常,您在实际代码中不应该这样做 由于使用方式与其他人的期望完全不同。意外的事情是非直观的,并且非直观性使代码难以维护(或理解)不熟悉代码库的人。

但作为一项学术活动。

你想要的是让运算符==返回一个对象,这样如果它在另一个测试中使用它将进行测试,但如果它只是留在布尔上下文中,那么它将自动转换为bool。 / p>

#include <iostream>
using namespace std;

template<typename T>
class Test
{
    public:
        Test(T const& v, bool s)
            :value(v)
            ,state(s)
    {}

    Test operator==(T const& rhs) const
    {
        return Test<T>(value, state && value == rhs);
    }
    operator bool() const
    {
        return state;
    }
    private:
        T const&    value;
        bool        state;
};

class A
{
    int a;
    public:
    A(int x) { a = x; }
    Test<A> operator==(const A& obRight) const
    {
        return Test<A>(*this, a == obRight.a);
    }
};

int main()
{
    A ob(10), ob2(10), ob3(14);
    if(ob == ob2) // This equality comparison compiles fine.
        cout<<"Equal"<<endl;
    if(ob == ob2 == ob3) 
        cout<<"Equal"<<endl;
}

答案 2 :(得分:1)

您可以创建这样的功能

#include<stdarg.h>
template<class T>
bool equals(size_t num, T val,...)
{
    va_list arguments;

    va_start(arguments,num);

    for(size_t i = 0; i<num; ++i)
        if(val != va_arg(arguments, int))
        {
            va_end ( arguments );
            return false;       
        }
    va_end ( arguments );
    return true;
}

并使用它

if(equals(3,ob1,ob2,ob3))
    //do some stuff here