#include <iostream>
#include <typeinfo>
class Base {
public :
typedef Base Type;
// using T2 = Base;
// typedef decltype(*this) H;
Base( ) { }
} ;
class Next : public Base{
public :
typedef Next Type;
// using T2 = Next;
// typedef decltype(*this) H;
Next( ) { }
} ;
template < class T>
class TGetter {
public :
typedef T Ty;
} ;
int main( )
{
Next N;
Base * p = & N;
//using T = decltype(p);
//typename (*T)::T X;
TGetter< decltype( * p) > :: Ty :: Type T( ) ;
std:: cout << typeid ( T) .name ( ) << std:: endl ; //need Next!
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CgpjbGFzcyBCYXNlIHsKcHVibGljOgoJdHlwZWRlZiBCYXNlIFR5cGU7Ci8vCXVzaW5nIFQyID0gQmFzZTsKLy8JdHlwZWRlZiBkZWNsdHlwZSgqdGhpcykgSDsKCUJhc2UoKSB7fQp9OwoKY2xhc3MgTmV4dCA6cHVibGljIEJhc2V7CnB1YmxpYzoKCXR5cGVkZWYgTmV4dCBUeXBlOwovLwl1c2luZyBUMiA9IE5leHQ7Ci8vCXR5cGVkZWYgZGVjbHR5cGUoKnRoaXMpIEg7CglOZXh0KCkge30KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFRHZXR0ZXIgewpwdWJsaWM6Cgl0eXBlZGVmIFQgVHk7Cgp9OwoKaW50IG1haW4oKQp7CglOZXh0IE47CglCYXNlICpwID0gJk47CgkvL3VzaW5nIFQgPSBkZWNsdHlwZShwKTsKCS8vdHlwZW5hbWUgKCpUKTo6VCBYOwoJVEdldHRlcjxkZWNsdHlwZSgqcCk+OjpUeTo6VHlwZSBUKCk7CglzdGQ6OmNvdXQgPDwgdHlwZWlkKFQpLm5hbWUoKSA8PCBzdGQ6OmVuZGw7Ly9uZWVkIE5leHQhCgoKICAgIHJldHVybiAwOwp9