В C++ вам нужно перегрузить operator == в обоих направлениях?
Скажем, я работаю с классом:
class Foo{
public:
std:string name;
/*...*/
}/*end Foo*/
и я предоставляю перегрузку для operator==
bool operator==(const Foo& fooObj, const std::string& strObj) {
return (fooObj.name == strObj);
}
Нужно ли мне также повторять ту же логику в обратном порядке?
bool operator==(const std::string& strObj, const Foo& fooObj) {
return (strObj == fooObj.name);
}
Ответы
Ответ 1
Если вы хотите поддерживать сравнения, где строка находится слева, а Foo
- справа. Реализация не будет изменять порядок аргументов перегруженному operator==
чтобы он работал.
Но вы можете избежать повторения логики реализации. Предполагая, что ваш оператор должен вести себя так, как ожидалось:
inline bool operator==(const std::string& objA, const Foo& objB) {
return objB == objA; // Reuse previously defined operator
}
Ответ 2
Да, да. Как и во многих других языках, C++ принимает стороны, а сравнения между двумя объектами разных типов приведут к вызовам двух разных операторов сравнения в зависимости от порядка.
Конечно, вы хотите, чтобы они были последовательными и неудивительными, поэтому второй должен определяться с точки зрения первого.