#include<iostream>
#include<typeinfo>
#include<cxxabi.h>
using namespace std;
template<typename T>
const char* realname (T &obj)
{
return abi::__cxa_demangle(typeid(obj).name(), 0, 0, 0);
}
template<typename T>
struct ActualType { typedef T type; };
template<typename T>
struct ActualType<T*> { typedef typename ActualType<T>::type type; };
template<class Pointer>
struct A
{
typename ActualType<Pointer>::type obj;
void print ()
{
cout << "realname(obj) = " << realname(obj) << endl;
}
};
int main ()
{
A<int> a1;
A<int*> a2;
A<int**> a3;
a1.print();
a2.print();
a3.print();
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHR5cGVpbmZvPgojaW5jbHVkZTxjeHhhYmkuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNvbnN0IGNoYXIqIHJlYWxuYW1lIChUICZvYmopIAp7CiAgcmV0dXJuIGFiaTo6X19jeGFfZGVtYW5nbGUodHlwZWlkKG9iaikubmFtZSgpLCAwLCAwLCAwKTsKfQoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBBY3R1YWxUeXBlIHsgdHlwZWRlZiBUIHR5cGU7IH07CnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBBY3R1YWxUeXBlPFQqPiB7IHR5cGVkZWYgdHlwZW5hbWUgQWN0dWFsVHlwZTxUPjo6dHlwZSB0eXBlOyB9OwoKdGVtcGxhdGU8Y2xhc3MgUG9pbnRlcj4Kc3RydWN0IEEKewogIHR5cGVuYW1lIEFjdHVhbFR5cGU8UG9pbnRlcj46OnR5cGUgb2JqOwoKICB2b2lkIHByaW50ICgpCiAgewogICAgY291dCA8PCAicmVhbG5hbWUob2JqKSA9ICIgPDwgcmVhbG5hbWUob2JqKSA8PCBlbmRsOwogIH0KfTsKCmludCBtYWluICgpCnsKICBBPGludD4gYTE7CiAgQTxpbnQqPiBhMjsKICBBPGludCoqPiBhMzsKCiAgYTEucHJpbnQoKTsKICBhMi5wcmludCgpOwogIGEzLnByaW50KCk7Cn0K