#include <iostream>
using namespace std;
struct NoComparable {
};
struct ComparableWithItself {
};
bool operator == (ComparableWithItself const &lhs, ComparableWithItself const &rhs) {
return true;
}
struct ComparableWithItselfAndOther {
bool operator == (ComparableWithItselfAndOther const &lhs) const {
return true;
}
bool operator == (ComparableWithItself const &lhs) const {
return true;
}
};
namespace CHECK // namespace to let "operator ==" not become global
{
typedef char no[7];
template<typename T, typename T2> no& operator == (const T&, const T2&);
template <typename T, typename T2>
struct opEqualExists // *(T*)(0) can be replaced by *new T[1] also
{
enum { value = (sizeof(*(T*)(0) == *(T2*)(0)) != sizeof(no)) };
};
}
int main() {
std::cout << CHECK::opEqualExists<ComparableWithItselfAndOther, ComparableWithItselfAndOther>::value << std::endl;
std::cout << CHECK::opEqualExists<ComparableWithItself, ComparableWithItself>::value << std::endl;
std::cout << CHECK::opEqualExists<ComparableWithItselfAndOther, ComparableWithItself>::value << std::endl;
std::cout << CHECK::opEqualExists<ComparableWithItself, ComparableWithItselfAndOther>::value << std::endl;
std::cout << CHECK::opEqualExists<NoComparable, NoComparable>::value << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnN0cnVjdCBOb0NvbXBhcmFibGUgewp9OwoKc3RydWN0IENvbXBhcmFibGVXaXRoSXRzZWxmIHsKfTsKCmJvb2wgb3BlcmF0b3IgPT0gKENvbXBhcmFibGVXaXRoSXRzZWxmIGNvbnN0ICZsaHMsIENvbXBhcmFibGVXaXRoSXRzZWxmIGNvbnN0ICZyaHMpIHsKICAgIHJldHVybiB0cnVlOwp9CgpzdHJ1Y3QgQ29tcGFyYWJsZVdpdGhJdHNlbGZBbmRPdGhlciB7CiAgICBib29sIG9wZXJhdG9yID09IChDb21wYXJhYmxlV2l0aEl0c2VsZkFuZE90aGVyIGNvbnN0ICZsaHMpIGNvbnN0IHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIAogICAgYm9vbCBvcGVyYXRvciA9PSAoQ29tcGFyYWJsZVdpdGhJdHNlbGYgY29uc3QgJmxocykgY29uc3QgewogICAgCXJldHVybiB0cnVlOwogICAgfQp9OwoKbmFtZXNwYWNlIENIRUNLICAvLyBuYW1lc3BhY2UgdG8gbGV0ICJvcGVyYXRvciA9PSIgbm90IGJlY29tZSBnbG9iYWwKewogIHR5cGVkZWYgY2hhciBub1s3XTsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBUMj4gbm8mIG9wZXJhdG9yID09IChjb25zdCBUJiwgY29uc3QgVDImKTsKCiAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFQyPgogIHN0cnVjdCBvcEVxdWFsRXhpc3RzIC8vICooVCopKDApIGNhbiBiZSByZXBsYWNlZCBieSAqbmV3IFRbMV0gYWxzbwogIHsKICAgIGVudW0geyB2YWx1ZSA9IChzaXplb2YoKihUKikoMCkgPT0gKihUMiopKDApKSAhPSBzaXplb2Yobm8pKSB9OwogIH07Cn0KCgppbnQgbWFpbigpIHsKICAgIHN0ZDo6Y291dCA8PCBDSEVDSzo6b3BFcXVhbEV4aXN0czxDb21wYXJhYmxlV2l0aEl0c2VsZkFuZE90aGVyLCBDb21wYXJhYmxlV2l0aEl0c2VsZkFuZE90aGVyPjo6dmFsdWUgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IENIRUNLOjpvcEVxdWFsRXhpc3RzPENvbXBhcmFibGVXaXRoSXRzZWxmLCBDb21wYXJhYmxlV2l0aEl0c2VsZj46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBDSEVDSzo6b3BFcXVhbEV4aXN0czxDb21wYXJhYmxlV2l0aEl0c2VsZkFuZE90aGVyLCBDb21wYXJhYmxlV2l0aEl0c2VsZj46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBDSEVDSzo6b3BFcXVhbEV4aXN0czxDb21wYXJhYmxlV2l0aEl0c2VsZiwgQ29tcGFyYWJsZVdpdGhJdHNlbGZBbmRPdGhlcj46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBDSEVDSzo6b3BFcXVhbEV4aXN0czxOb0NvbXBhcmFibGUsIE5vQ29tcGFyYWJsZT46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKICAgIAoJcmV0dXJuIDA7Cn0=