#include <iostream>
#include <typeinfo>
using namespace std;
template <class C> struct MakeAlias : C{ typedef C Base; };
class StackTrace{
public:
static int var;
virtual ~StackTrace() {}
template <class T> void printStackTrace(T* c){
if(typeid(T)==typeid(StackTrace))return;
cout << typeid(T).name() << "." << endl;
class T::Base *V;
printStackTrace(V);
}
void printStackTrace(StackTrace *c)
{
cout << typeid(StackTrace).name() << "." << endl;
}
};
class A : public MakeAlias<StackTrace>{
};
class B : public MakeAlias<A>{
};
class C : public MakeAlias<B>{
public:
void hello(){
cout << "hello from ";
StackTrace::printStackTrace(this);
cout << endl;
}
};
int main(){
C c;
c.hello();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlIDxjbGFzcyBDPiBzdHJ1Y3QgTWFrZUFsaWFzIDogQ3sgdHlwZWRlZiBDIEJhc2U7IH07CmNsYXNzIFN0YWNrVHJhY2V7CiAgICAgIHB1YmxpYzoKICAgICAgc3RhdGljIGludCB2YXI7CiAgICAgIHZpcnR1YWwgflN0YWNrVHJhY2UoKSB7fQogICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBwcmludFN0YWNrVHJhY2UoVCogYyl7CiAgICAgICAgICBpZih0eXBlaWQoVCk9PXR5cGVpZChTdGFja1RyYWNlKSlyZXR1cm47IAogICAgICAgICAgY291dCA8PCB0eXBlaWQoVCkubmFtZSgpIDw8ICIuIiA8PCBlbmRsOwogICAgICAgICAgY2xhc3MgVDo6QmFzZSAqVjsKICAgICAgICAgIHByaW50U3RhY2tUcmFjZShWKTsKICAgICB9CiAgICB2b2lkIHByaW50U3RhY2tUcmFjZShTdGFja1RyYWNlICpjKQogICAgewogICAgICBjb3V0IDw8IHR5cGVpZChTdGFja1RyYWNlKS5uYW1lKCkgPDwgIi4iIDw8IGVuZGw7CiAgICB9Cn07CmNsYXNzIEEgOiBwdWJsaWMgTWFrZUFsaWFzPFN0YWNrVHJhY2U+ewp9OwpjbGFzcyBCIDogcHVibGljIE1ha2VBbGlhczxBPnsKfTsKY2xhc3MgQyA6IHB1YmxpYyBNYWtlQWxpYXM8Qj57CiAgICBwdWJsaWM6CiAgICB2b2lkIGhlbGxvKCl7CiAgICAgICAgY291dCA8PCAiaGVsbG8gZnJvbSAiOwogICAgICAgIFN0YWNrVHJhY2U6OnByaW50U3RhY2tUcmFjZSh0aGlzKTsKICAgICAgICBjb3V0IDw8IGVuZGw7CiAgICB9Cgp9OwppbnQgbWFpbigpewogICAgQyBjOwogICAgYy5oZWxsbygpOwp9