#include <iostream>
#include <utility>
using namespace std;
template <typename T, typename Enable = typename std::conditional<!std::is_fundamental<T>::value,
std::true_type,
std::false_type>::type>
struct strong_typedef;
//specialization for non fundamental types
template <typename T>
struct strong_typedef<T, std::true_type> : public T
{
template <typename... Args>
strong_typedef(Args&&... args) : T(std::forward<Args>(args)...) {}
};
//specialization for fundamental types
template <typename T>
struct strong_typedef<T, std::false_type>
{
T t;
explicit strong_typedef(const T t_) : t(t_) {};
strong_typedef(){};
strong_typedef(const strong_typedef & t_) : t(t_.t){}
strong_typedef & operator=(const strong_typedef & rhs) { t = rhs.t; return *this;}
strong_typedef & operator=(const T & rhs) { t = rhs; return *this;}
/*operator const T & () const {return t; }*/
operator T & () { return t; }
bool operator==(const strong_typedef & rhs) const { return t == rhs.t; }
bool operator<(const strong_typedef & rhs) const { return t < rhs.t; }
};
struct A {int value;};
using B = strong_typedef<A>;
int main() {
B test;
test.value = 4;
std::cout << test.value << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRW5hYmxlID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDwhc3RkOjppc19mdW5kYW1lbnRhbDxUPjo6dmFsdWUsCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRydWVfdHlwZSwKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZmFsc2VfdHlwZT46OnR5cGU+CnN0cnVjdCBzdHJvbmdfdHlwZWRlZjsKCi8vc3BlY2lhbGl6YXRpb24gZm9yIG5vbiBmdW5kYW1lbnRhbCB0eXBlcwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IHN0cm9uZ190eXBlZGVmPFQsIHN0ZDo6dHJ1ZV90eXBlPiA6IHB1YmxpYyBUCnsKCXRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgoJc3Ryb25nX3R5cGVkZWYoQXJncyYmLi4uIGFyZ3MpIDogVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pIHt9Cn07CgovL3NwZWNpYWxpemF0aW9uIGZvciBmdW5kYW1lbnRhbCB0eXBlcwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IHN0cm9uZ190eXBlZGVmPFQsIHN0ZDo6ZmFsc2VfdHlwZT4KeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBUIHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIGV4cGxpY2l0IHN0cm9uZ190eXBlZGVmKGNvbnN0IFQgdF8pIDogdCh0Xykge307ICAgICAgICAgIAogICAgc3Ryb25nX3R5cGVkZWYoKXt9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBzdHJvbmdfdHlwZWRlZihjb25zdCBzdHJvbmdfdHlwZWRlZiAmIHRfKSA6IHQodF8udCl7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgc3Ryb25nX3R5cGVkZWYgJiBvcGVyYXRvcj0oY29uc3Qgc3Ryb25nX3R5cGVkZWYgJiByaHMpIHsgdCA9IHJocy50OyByZXR1cm4gKnRoaXM7fSAgICAKICAgIHN0cm9uZ190eXBlZGVmICYgb3BlcmF0b3I9KGNvbnN0IFQgJiByaHMpIHsgdCA9IHJoczsgcmV0dXJuICp0aGlzO30gICAgICAKICAgIC8qb3BlcmF0b3IgY29uc3QgVCAmICgpIGNvbnN0IHtyZXR1cm4gdDsgfSovICAgICAgICAgICAgICAgIAogICAgb3BlcmF0b3IgVCAmICgpIHsgcmV0dXJuIHQ7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc3Ryb25nX3R5cGVkZWYgJiByaHMpIGNvbnN0IHsgcmV0dXJuIHQgPT0gcmhzLnQ7IH0gCiAgICBib29sIG9wZXJhdG9yPChjb25zdCBzdHJvbmdfdHlwZWRlZiAmIHJocykgY29uc3QgeyByZXR1cm4gdCA8IHJocy50OyB9ICAgCn07CQoKc3RydWN0IEEge2ludCB2YWx1ZTt9Owp1c2luZyBCID0gc3Ryb25nX3R5cGVkZWY8QT47CgppbnQgbWFpbigpIHsKCUIgdGVzdDsKCXRlc3QudmFsdWUgPSA0OwoJc3RkOjpjb3V0IDw8IHRlc3QudmFsdWUgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0=