#include <iostream>
namespace CHECK // namespace to let "operator ==" not become global
{
typedef char no[7];
template<typename T> no& operator == (const T&, const T&);
template <typename T>
struct opEqualExists // *(T*)(0) can be replaced by *new T[1] also
{
enum { value = (sizeof(*(T*)(0) == *(T*)(0)) != sizeof(no)) };
};
}
#pragma pack(1)
struct A
{
int x;
short y;
char z;
A& operator == (A const &);
};
#pragma pack()
int main() {
std::cout << "sizeof(A) = " << sizeof(A) << std::endl;
std::cout<< "operator ==() : exists? " << CHECK::opEqualExists<A>::value<<std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKbmFtZXNwYWNlIENIRUNLICAvLyBuYW1lc3BhY2UgdG8gbGV0ICJvcGVyYXRvciA9PSIgbm90IGJlY29tZSBnbG9iYWwKewogIHR5cGVkZWYgY2hhciBub1s3XTsKICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBubyYgb3BlcmF0b3IgPT0gKGNvbnN0IFQmLCBjb25zdCBUJik7CgogIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogIHN0cnVjdCBvcEVxdWFsRXhpc3RzIC8vICooVCopKDApIGNhbiBiZSByZXBsYWNlZCBieSAqbmV3IFRbMV0gYWxzbwogIHsKICAgIGVudW0geyB2YWx1ZSA9IChzaXplb2YoKihUKikoMCkgPT0gKihUKikoMCkpICE9IHNpemVvZihubykpIH07CiAgfTsKfQoKI3ByYWdtYSBwYWNrKDEpCnN0cnVjdCBBIAp7IAoJaW50IHg7CglzaG9ydCB5OwoJY2hhciB6OwoJCglBJiBvcGVyYXRvciA9PSAoQSBjb25zdCAmKTsKfTsKI3ByYWdtYSBwYWNrKCkKCmludCBtYWluKCkgewoJc3RkOjpjb3V0IDw8ICJzaXplb2YoQSkgPSAiIDw8IHNpemVvZihBKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQ8PCAib3BlcmF0b3IgPT0oKSA6ICBleGlzdHM/ICAiIDw8IENIRUNLOjpvcEVxdWFsRXhpc3RzPEE+Ojp2YWx1ZTw8c3RkOjplbmRsOwp9