//for testing
#include <iostream>
#include <vector>
#include <string>
#include <string>
#include <cxxabi.h>
template<typename T>
std::string type_name()
{
std::string tname = typeid(T).name();
#if defined(__clang__) || defined(__GNUG__)
int status;
char *demangled_name = abi::__cxa_demangle(tname.c_str(), NULL, NULL, &status);
if(status == 0)
{
tname = demangled_name;
std::free(demangled_name);
}
#endif
return tname;
}
//just testing it
struct MyStruct {};
int main()
{
std::cout<<type_name<int>()<<"\n"
<<type_name<bool(MyStruct,MyStruct)>()<<"\n"
<<type_name<std::vector<int>>();
return 0;
}
Ly9mb3IgdGVzdGluZwojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y3h4YWJpLmg+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdGQ6OnN0cmluZyB0eXBlX25hbWUoKQp7CglzdGQ6OnN0cmluZyB0bmFtZSA9IHR5cGVpZChUKS5uYW1lKCk7CgkjaWYgZGVmaW5lZChfX2NsYW5nX18pIHx8IGRlZmluZWQoX19HTlVHX18pCglpbnQgc3RhdHVzOwoJY2hhciAqZGVtYW5nbGVkX25hbWUgPSBhYmk6Ol9fY3hhX2RlbWFuZ2xlKHRuYW1lLmNfc3RyKCksIE5VTEwsIE5VTEwsICZzdGF0dXMpOwoJaWYoc3RhdHVzID09IDApCgl7CgkJdG5hbWUgPSBkZW1hbmdsZWRfbmFtZTsKCQlzdGQ6OmZyZWUoZGVtYW5nbGVkX25hbWUpOwoJfQoJI2VuZGlmCglyZXR1cm4gdG5hbWU7Cn0KCi8vanVzdCB0ZXN0aW5nIGl0CnN0cnVjdCBNeVN0cnVjdCB7fTsKCmludCBtYWluKCkKewoJc3RkOjpjb3V0PDx0eXBlX25hbWU8aW50PigpPDwiXG4iCgk8PHR5cGVfbmFtZTxib29sKE15U3RydWN0LE15U3RydWN0KT4oKTw8IlxuIgoJPDx0eXBlX25hbWU8c3RkOjp2ZWN0b3I8aW50Pj4oKTsKCXJldHVybiAwOwp9