#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