#include <iostream>
#include <typeinfo>
#include <memory>
#include <cxxabi.h>
#include <string>
template <typename T> std::string TypeName(T) {
auto name = typeid(T).name();
int status = 0;
std::unique_ptr<char, void(*)(void*)> res {
abi::__cxa_demangle(name, NULL, NULL, &status),
std::free
};
return ((status == 0) ? res.get() : name);
}
int main()
{
int i = 0;
float f = 0.f;
std::cout << TypeName(i) << '\n'; // int
std::cout << TypeName(f) << '\n'; // float, so far so good
std::cout << TypeName(&i) << '\n'; // int *
std::cout << TypeName(&f) << '\n'; // float *, as expected
const int ci = 1;
const float cf = 1.f;
std::cout << TypeName(ci) << '\n'; // int!
std::cout << TypeName(cf) << '\n'; // float!
int &ri = i;
float &rf = f;
std::cout << TypeName(ri) << '\n'; // int!
std::cout << TypeName(rf) << '\n'; // float!
const int &cri = i;
const float &crf = f;
std::cout << TypeName(cri) << '\n'; // int!
std::cout << TypeName(crf) << '\n'; // float!
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxjeHhhYmkuaD4KI2luY2x1ZGUgPHN0cmluZz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnN0cmluZyBUeXBlTmFtZShUKSB7CgogICAgYXV0byBuYW1lID0gdHlwZWlkKFQpLm5hbWUoKTsKICAgIGludCBzdGF0dXMgPSAwOwoKICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyLCB2b2lkKCopKHZvaWQqKT4gcmVzIHsKICAgICAgICBhYmk6Ol9fY3hhX2RlbWFuZ2xlKG5hbWUsIE5VTEwsIE5VTEwsICZzdGF0dXMpLAogICAgICAgIHN0ZDo6ZnJlZQogICAgfTsKCiAgICByZXR1cm4gKChzdGF0dXMgPT0gMCkgPyByZXMuZ2V0KCkgOiBuYW1lKTsKfQoKCmludCBtYWluKCkKewoJaW50IGkgPSAwOwoJZmxvYXQgZiA9IDAuZjsKCglzdGQ6OmNvdXQgPDwgVHlwZU5hbWUoaSkgPDwgJ1xuJzsgLy8gaW50CglzdGQ6OmNvdXQgPDwgVHlwZU5hbWUoZikgPDwgJ1xuJzsgLy8gZmxvYXQsIHNvIGZhciBzbyBnb29kCgoJc3RkOjpjb3V0IDw8IFR5cGVOYW1lKCZpKSA8PCAnXG4nOyAvLyBpbnQgKgoJc3RkOjpjb3V0IDw8IFR5cGVOYW1lKCZmKSA8PCAnXG4nOyAvLyBmbG9hdCAqLCBhcyBleHBlY3RlZAoKCWNvbnN0IGludCBjaSA9IDE7Cgljb25zdCBmbG9hdCBjZiA9IDEuZjsKCglzdGQ6OmNvdXQgPDwgVHlwZU5hbWUoY2kpIDw8ICdcbic7IC8vIGludCEKCXN0ZDo6Y291dCA8PCBUeXBlTmFtZShjZikgPDwgJ1xuJzsgLy8gZmxvYXQhCgoJaW50ICZyaSA9IGk7CglmbG9hdCAmcmYgPSBmOwoKCXN0ZDo6Y291dCA8PCBUeXBlTmFtZShyaSkgPDwgJ1xuJzsgLy8gaW50IQoJc3RkOjpjb3V0IDw8IFR5cGVOYW1lKHJmKSA8PCAnXG4nOyAvLyBmbG9hdCEKCgljb25zdCBpbnQgJmNyaSA9IGk7Cgljb25zdCBmbG9hdCAmY3JmID0gZjsKCglzdGQ6OmNvdXQgPDwgVHlwZU5hbWUoY3JpKSA8PCAnXG4nOyAvLyBpbnQhCglzdGQ6OmNvdXQgPDwgVHlwZU5hbWUoY3JmKSA8PCAnXG4nOyAvLyBmbG9hdCEKCglyZXR1cm4gMDsKfQ==