Перегрузка операторов сравнения для разных типов в 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 в качестве аргумента с левой или правой стороны)