- #include<iostream> 
- #include <type_traits> 
-   
- using namespace std; 
-   
-   
- template <class TO, class FROM> 
- typename enable_if<!is_pointer<FROM>::value, TO>::type 
- punning_cast(const FROM &input) { 
- 	cout << "reference version" << endl; 
- } 
-   
- template <class TO, class FROM> 
- typename enable_if<is_pointer<FROM>::value, TO>::type 
- punning_cast(const FROM input) { 
- 	cout << "pointer version" << endl; 
- } 
-   
- int main() 
- { 
- 	int k(0); 
- 	int *p = &k; 
-   
- 	punning_cast<void>(k); 
- 	punning_cast<void>(p); 
-   
- 	return 0; 
- } 
				I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKdGVtcGxhdGUgPGNsYXNzIFRPLCBjbGFzcyBGUk9NPgp0eXBlbmFtZSBlbmFibGVfaWY8IWlzX3BvaW50ZXI8RlJPTT46OnZhbHVlLCBUTz46OnR5cGUKcHVubmluZ19jYXN0KGNvbnN0IEZST00gJmlucHV0KSB7Cgljb3V0IDw8ICJyZWZlcmVuY2UgdmVyc2lvbiIgPDwgZW5kbDsKfQoKdGVtcGxhdGUgPGNsYXNzIFRPLCBjbGFzcyBGUk9NPgp0eXBlbmFtZSBlbmFibGVfaWY8aXNfcG9pbnRlcjxGUk9NPjo6dmFsdWUsIFRPPjo6dHlwZQpwdW5uaW5nX2Nhc3QoY29uc3QgRlJPTSBpbnB1dCkgewoJY291dCA8PCAicG9pbnRlciB2ZXJzaW9uIiA8PCBlbmRsOwp9CgppbnQgbWFpbigpCnsKCWludCBrKDApOwoJaW50ICpwID0gJms7CgoJcHVubmluZ19jYXN0PHZvaWQ+KGspOwoJcHVubmluZ19jYXN0PHZvaWQ+KHApOwoKCXJldHVybiAwOwp9