#include <iostream>
#include <typeinfo>
#include <string>
#include <map>
using namespace std;
// Quick proof of concept (to be improved)
map<const type_info*, string> mytypes;
template <class T>
const string& mytype(T &&x) {
return mytypes[&typeid(x)];
}
// Some test types
struct A { virtual int test() {} };
struct B : A {};
int main() {
// To be improved: initialization of the type info extension
mytypes[&typeid(int)]="Plain C++ integer";
mytypes[&typeid(A)]="Structure A";
mytypes[&typeid(B)]="Structure B";
// demo, including polymorphic type
int a;
A * p = new B;
cout << typeid(int).name() <<endl;
cout << mytype(a) <<endl;
cout << mytype(*p) <<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxtYXA+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBRdWljayBwcm9vZiBvZiBjb25jZXB0ICh0byBiZSBpbXByb3ZlZCkgCm1hcDxjb25zdCB0eXBlX2luZm8qLCBzdHJpbmc+IG15dHlwZXM7ICAKCnRlbXBsYXRlIDxjbGFzcyBUPgpjb25zdCBzdHJpbmcmIG15dHlwZShUICYmeCkgewoJcmV0dXJuIG15dHlwZXNbJnR5cGVpZCh4KV07Cn0KCi8vIFNvbWUgdGVzdCB0eXBlcyAKc3RydWN0IEEgeyB2aXJ0dWFsIGludCB0ZXN0KCkge30gfTsKc3RydWN0IEIgOiBBIHt9OyAKCmludCBtYWluKCkgewogICAgLy8gVG8gYmUgaW1wcm92ZWQ6ICBpbml0aWFsaXphdGlvbiBvZiB0aGUgdHlwZSBpbmZvIGV4dGVuc2lvbiAKCW15dHlwZXNbJnR5cGVpZChpbnQpXT0iUGxhaW4gQysrIGludGVnZXIiOwoJbXl0eXBlc1smdHlwZWlkKEEpXT0iU3RydWN0dXJlIEEiOwoJbXl0eXBlc1smdHlwZWlkKEIpXT0iU3RydWN0dXJlIEIiOwoKICAgIC8vIGRlbW8sIGluY2x1ZGluZyBwb2x5bW9ycGhpYyB0eXBlIAkKCWludCBhOyAKCUEgKiBwID0gbmV3IEI7CiAgICBjb3V0IDw8IHR5cGVpZChpbnQpLm5hbWUoKSA8PGVuZGw7IAogICAgY291dCA8PCBteXR5cGUoYSkgPDxlbmRsOyAKICAgIGNvdXQgPDwgbXl0eXBlKCpwKSA8PGVuZGw7IAoJcmV0dXJuIDA7Cn0=