- #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=