#include <cstdio>
#include <typeinfo>
#include <type_traits>
template<class U, class V> void f2(V x)
{
printf("%s\n", typeid(U).name());
}
template<class T> void f(T x)
{
f2<typename std::remove_pointer<T>::type>(x);
}
int main(void)
{
f(reinterpret_cast<char *>(NULL));
f(reinterpret_cast<const char *>(NULL));
f(reinterpret_cast<int *>(NULL));
f(reinterpret_cast<const int *>(NULL));
return 0;
}