#include <iostream>
#include <limits>
 
#define WRAPPER(Name, defaultValue, maxValue) \
template <class T> \
struct Name { \
    T value; \
    constexpr inline Name(const T& value = defaultValue) : value(value) {} \
    explicit inline operator T() const { return value; } \
    explicit inline operator bool() const { return value != defaultValue; }
 
WRAPPER(Assign, -std::numeric_limits<T>::max(), std::numeric_limits<T>::max())
    inline void operator += (const Assign& other) {
        if (other) value = other.value;
    }
    friend inline Assign operator + (const Assign& lhs, const Assign& rhs) {
        return rhs.value;
    }
};
 
WRAPPER(Sum, 0, std::numeric_limits<T>::max() / 2)
    inline void operator += (const Sum& other) { value += other.value; }
    inline void operator += (const Assign<T>& other) {
        if (other) value = other.value;
    }
    friend inline Sum operator + (const Sum& lhs, const Sum& rhs) {
        return lhs.value + rhs.value;
    }
};
 
int main() {
    Sum<int> sum(2);
    sum += Sum<int>(3);
    std::cout << (int)sum << std::endl;
    sum += Assign<int>(4);
    std::cout << (int)sum << std::endl;
    return 0;
}
 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgoKI2RlZmluZSBXUkFQUEVSKE5hbWUsIGRlZmF1bHRWYWx1ZSwgbWF4VmFsdWUpIFwKdGVtcGxhdGUgPGNsYXNzIFQ+IFwKc3RydWN0IE5hbWUgeyBcCiAgICBUIHZhbHVlOyBcCiAgICBjb25zdGV4cHIgaW5saW5lIE5hbWUoY29uc3QgVCYgdmFsdWUgPSBkZWZhdWx0VmFsdWUpIDogdmFsdWUodmFsdWUpIHt9IFwKICAgIGV4cGxpY2l0IGlubGluZSBvcGVyYXRvciBUKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0gXAogICAgZXhwbGljaXQgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiB2YWx1ZSAhPSBkZWZhdWx0VmFsdWU7IH0KCldSQVBQRVIoQXNzaWduLCAtc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCksIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpKQogICAgaW5saW5lIHZvaWQgb3BlcmF0b3IgKz0gKGNvbnN0IEFzc2lnbiYgb3RoZXIpIHsKICAgICAgICBpZiAob3RoZXIpIHZhbHVlID0gb3RoZXIudmFsdWU7CiAgICB9CiAgICBmcmllbmQgaW5saW5lIEFzc2lnbiBvcGVyYXRvciArIChjb25zdCBBc3NpZ24mIGxocywgY29uc3QgQXNzaWduJiByaHMpIHsKICAgICAgICByZXR1cm4gcmhzLnZhbHVlOwogICAgfQp9OwoKV1JBUFBFUihTdW0sIDAsIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpIC8gMikKICAgIGlubGluZSB2b2lkIG9wZXJhdG9yICs9IChjb25zdCBTdW0mIG90aGVyKSB7IHZhbHVlICs9IG90aGVyLnZhbHVlOyB9CiAgICBpbmxpbmUgdm9pZCBvcGVyYXRvciArPSAoY29uc3QgQXNzaWduPFQ+JiBvdGhlcikgewogICAgICAgIGlmIChvdGhlcikgdmFsdWUgPSBvdGhlci52YWx1ZTsKICAgIH0KICAgIGZyaWVuZCBpbmxpbmUgU3VtIG9wZXJhdG9yICsgKGNvbnN0IFN1bSYgbGhzLCBjb25zdCBTdW0mIHJocykgewogICAgICAgIHJldHVybiBsaHMudmFsdWUgKyByaHMudmFsdWU7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIFN1bTxpbnQ+IHN1bSgyKTsKICAgIHN1bSArPSBTdW08aW50PigzKTsKICAgIHN0ZDo6Y291dCA8PCAoaW50KXN1bSA8PCBzdGQ6OmVuZGw7CiAgICBzdW0gKz0gQXNzaWduPGludD4oNCk7CiAgICBzdGQ6OmNvdXQgPDwgKGludClzdW0gPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0K