#include<iostream>
#include <string>
#include <typeinfo>
#include <cstdlib>
#include <memory>
#include <cxxabi.h>
using namespace std;
std::string demangle(const char* name) {
int status = -4; // some arbitrary value to eliminate the compiler warning
// enable c++11 by passing the flag -std=c++11 to g++
std::unique_ptr<char, void(*)(void*)> res {
abi::__cxa_demangle(name, NULL, NULL, &status),
std::free
};
return (status==0) ? res.get() : name ;
}
template <typename T> struct typename_struct {
static std::string name() {
std::string typeName = typeid(T).name();
return demangle(typeName.c_str());
}
};
int main(){
cout << typename_struct<int****>::name();
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx0eXBlaW5mbz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDxjeHhhYmkuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0ZDo6c3RyaW5nIGRlbWFuZ2xlKGNvbnN0IGNoYXIqIG5hbWUpIHsKICAgIGludCBzdGF0dXMgPSAtNDsgLy8gc29tZSBhcmJpdHJhcnkgdmFsdWUgdG8gZWxpbWluYXRlIHRoZSBjb21waWxlciB3YXJuaW5nCgogICAgLy8gZW5hYmxlIGMrKzExIGJ5IHBhc3NpbmcgdGhlIGZsYWcgLXN0ZD1jKysxMSB0byBnKysKICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyLCB2b2lkKCopKHZvaWQqKT4gcmVzIHsKICAgICAgICBhYmk6Ol9fY3hhX2RlbWFuZ2xlKG5hbWUsIE5VTEwsIE5VTEwsICZzdGF0dXMpLAogICAgICAgIHN0ZDo6ZnJlZQogICAgfTsKICAgIHJldHVybiAoc3RhdHVzPT0wKSA/IHJlcy5nZXQoKSA6IG5hbWUgOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHR5cGVuYW1lX3N0cnVjdCB7CiAgc3RhdGljIHN0ZDo6c3RyaW5nIG5hbWUoKSB7CiAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZSA9IHR5cGVpZChUKS5uYW1lKCk7CiAgICByZXR1cm4gZGVtYW5nbGUodHlwZU5hbWUuY19zdHIoKSk7CiAgfQp9OwoKaW50IG1haW4oKXsKCiAgY291dCA8PCB0eXBlbmFtZV9zdHJ1Y3Q8aW50KioqKj46Om5hbWUoKTsKCiAgcmV0dXJuIDA7Cn0=