Перегрузка операторов сравнения для разных типов в c++

мне нужно иметь возможность сравнивать один из моих классов (который содержит намного больше, чем целое число) с целыми числами, даже если это может немного растягивать равенство...

как перегрузить оператор равенства для разных типов?

у меня в основном есть такой класс

struct MyClass {
    int start;
    int middle;
    int threequarters;
};

и перегруженный оператор

inline bool operator==(const MyClass& lhs, const MyClass& rhs) {
    return lhs.middle == rhs.middle;
}

поэтому при сравнении с целыми числами мне нужно сравнить с средняя переменная, но я не уверен, что мне нужны два набора функций оператора, один, где integer-lhs, а другой, где integer-rhs?

inline bool operator==(const int& lhs, const MyClass& rhs) {
    return lhs == rhs.middle;
}

inline bool operator==(const MyClass& lhs, const int& rhs) {
    return lhs.middle == rhs;
}

3 ответов


чтобы уточнить из моего комментария, это будет поддерживать код, поэтому вы можете либо предоставить все варианты операторов:

inline bool operator==(const MyClass& lhs, const MyClass& rhs) {
return lhs.middle == rhs.middle;
}

inline bool operator==(const int& lhs, const MyClass& rhs) {
return lhs == rhs.middle;
}

inline bool operator==(const MyClass& lhs, const int& rhs) {
return lhs.middle == rhs;
}

и сделайте это для каждого оператора (который взрывается в значительное количество кода). Или, если это имеет смысл, вы можете предоставить конструктор, который строит из int:

struct MyClass {
MyClass() {} // default
MyClass( int x ) { /* init for an int here */ }
int start;
int middle;
int threequarters;
};

если вы это сделаете, вам понадобится только версия MyClass, MyClass для каждого оператора:

inline bool operator==(const MyClass& lhs, const MyClass& rhs) {
return lhs.middle == rhs.middle;
}

потому что когда компилятор видит:

if ( 5 == my_class ) {}

он на самом деле делает это:

if ( MyClass(5).operator==( my_class ) ) {}

Да, вы должны определить три оператора == при условии, что ваш класс не имеет конструктора преобразования для объектов типа int.

inline bool operator==(const MyClass& lhs, const MyClass& rhs) {
    return lhs.middle == rhs.middle;
}

inline bool operator==(const MyClass& lhs, int rhs) {
    return lhs.middle == rhs;
}

inline bool operator==(int lhs, const MyClass& rhs) {
    return operator ==( rhs, lhs );
}

да, вам нужны оба оператора.

bool operator==(const A& a, const int & b)
{
    return a.value == b;
};

только с указанным выше оператором компилятор выдаст ошибку, что преобразование не доступно, если вы попробуете следующее:2 == a (учитывая, что класс A не имеет неявные конструкторы, которые принимают целое число в качестве аргумента)

для каждой двоичной операции компилятор пытается выполнить неявное преобразование в соответствии с операцией. Например, если class A у operator int определение, вам не понадобится операторы, так как компилятор неявно преобразует A введите целое число, а затем выполните bool operator==(int,int) операции. Если оператор не определен, компилятор выдает ошибку, говоря, что преобразование недоступно (i.e, нет оператора ==, который принимает a в качестве аргумента с левой или правой стороны)