#include <iostream>
template <typename T>
struct big_int
{
T value;
operator T() { return value; }
big_int& operator+=(big_int const& other)
{
value += other.value;
return *this;
}
template <typename U>
big_int& operator+=(U const& v)
{
value += v;
return *this;
}
big_int& operator++()
{
++value;
return *this;
}
big_int operator++(int)
{
big_int temp = *this;
++value;
return temp;
}
};
template <typename T>
struct small_int
{
T value;
operator T() { return value; }
};
typedef big_int<long> bigInt;
typedef small_int<char> smallInt;
class Problematic
{
public:
Problematic(bigInt) {}
Problematic(smallInt) {}
};
int main()
{
bigInt bi = { 4 };
std::cout << bi << "\n";
bi+=7;
std::cout << bi << "\n";
long l = 4;
bi+=l;
std::cout << bi << "\n";
++bi;
std::cout << bi << "\n";
bi++;
std::cout << bi << "\n";
std::cout << (bi == l) << "\n";
std::cout << (bi == 17) << "\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBiaWdfaW50CnsKICAgIFQgdmFsdWU7CiAgICBvcGVyYXRvciBUKCkgeyByZXR1cm4gdmFsdWU7IH0KCiAgICBiaWdfaW50JiBvcGVyYXRvcis9KGJpZ19pbnQgY29uc3QmIG90aGVyKQogICAgewogICAgICAgIHZhbHVlICs9IG90aGVyLnZhbHVlOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KICAgIGJpZ19pbnQmIG9wZXJhdG9yKz0oVSBjb25zdCYgdikKICAgIHsKICAgICAgICB2YWx1ZSArPSB2OwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBiaWdfaW50JiBvcGVyYXRvcisrKCkKICAgIHsKICAgICAgICArK3ZhbHVlOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBiaWdfaW50IG9wZXJhdG9yKysoaW50KQogICAgewogICAgICAgIGJpZ19pbnQgdGVtcCA9ICp0aGlzOwogICAgICAgICsrdmFsdWU7CiAgICAgICAgcmV0dXJuIHRlbXA7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IHNtYWxsX2ludAp7CiAgICBUIHZhbHVlOwogICAgb3BlcmF0b3IgVCgpIHsgcmV0dXJuIHZhbHVlOyB9Cn07Cgp0eXBlZGVmIGJpZ19pbnQ8bG9uZz4gYmlnSW50Owp0eXBlZGVmIHNtYWxsX2ludDxjaGFyPiBzbWFsbEludDsKCmNsYXNzIFByb2JsZW1hdGljCnsKcHVibGljOgogICAgUHJvYmxlbWF0aWMoYmlnSW50KSB7fQogICAgUHJvYmxlbWF0aWMoc21hbGxJbnQpIHt9Cn07CgppbnQgbWFpbigpCnsKICAgIGJpZ0ludCBiaSA9IHsgNCB9OwogICAgc3RkOjpjb3V0IDw8IGJpIDw8ICJcbiI7CgogICAgYmkrPTc7CiAgICBzdGQ6OmNvdXQgPDwgYmkgPDwgIlxuIjsKCiAgICBsb25nIGwgPSA0OwogICAgYmkrPWw7CiAgICBzdGQ6OmNvdXQgPDwgYmkgPDwgIlxuIjsKCiAgICArK2JpOwogICAgc3RkOjpjb3V0IDw8IGJpIDw8ICJcbiI7CgogICAgYmkrKzsKICAgIHN0ZDo6Y291dCA8PCBiaSA8PCAiXG4iOwoKICAgIHN0ZDo6Y291dCA8PCAoYmkgPT0gbCkgPDwgIlxuIjsKICAgIHN0ZDo6Y291dCA8PCAoYmkgPT0gMTcpIDw8ICJcbiI7Cn0K