#include <iostream>
#include <typeinfo>
using namespace std;
class base
{
public:
template<typename T>
void BindType( ) // do something with the type
{ cout << typeid(T*).name()<<endl; }
virtual ~base() {};
};
class derived : public base
{
public:
void foo() { BindType<decltype(this)>( ); }
};
class derived_once_more : public derived
{
};
int main() {
derived_once_more dom;
derived dd;
dom.foo();
dd.foo();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBiYXNlCnsKcHVibGljOiAKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICB2b2lkIEJpbmRUeXBlKCApIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSB0eXBlCiAgICB7IGNvdXQgPDwgdHlwZWlkKFQqKS5uYW1lKCk8PGVuZGw7IH0KICAgIHZpcnR1YWwgfmJhc2UoKSB7fTsKfTsKCmNsYXNzIGRlcml2ZWQgOiBwdWJsaWMgYmFzZQp7CnB1YmxpYzogCiAgICB2b2lkIGZvbygpIHsgQmluZFR5cGU8ZGVjbHR5cGUodGhpcyk+KCApOyB9IAp9OwoKY2xhc3MgZGVyaXZlZF9vbmNlX21vcmUgOiBwdWJsaWMgZGVyaXZlZAp7Cn07CgppbnQgbWFpbigpIHsKCWRlcml2ZWRfb25jZV9tb3JlIGRvbTsKCWRlcml2ZWQgZGQ7IAoJZG9tLmZvbygpOyAKCWRkLmZvbygpOyAKCXJldHVybiAwOwp9