Это хороший случай для использования бесплатных операторов.
bool operator==(TypeA const & a, TypeB const & b) {
// Do comparison
}
bool operator!=(TypeA const & a, TypeB const & b) {
return !(a == b);
}
bool operator==(TypeB const & b, TypeA const & a) {
return a == b;
}
bool operator!=(TypeB const & b, TypeA const & a) {
return a != b;
}
Вы должны только подружить их с соответствующими типами, если это необходимо; если состояние может полностью наблюдаться от участников publi c, нет необходимости заводить их в друзья.
Однако существует альтернативный подход: если значения этих типов можно считать равными, это означает, что один может быть преобразован в другой. Если это так, их можно сравнить после преобразования:
TypeA a{createTypeA()};
TypeB b{createTypeB()};
bool result = a == TypeA{b};