#include <cxxabi.h>
#include <typeinfo>
#include <iostream>
#include <string>
#include <memory>
#include <cstdlib>
std::string demangle(const char* mangled)
{
int status;
std::unique_ptr<char[], void (*)(void*)> result(
abi::__cxa_demangle(mangled, 0, 0, &status), std::free);
return result.get() ? std::string(result.get()) : "error occurred";
}
template<class T>
void foo(T t) { std::cout << demangle(typeid(t).name()) << std::endl; }
int main() {
foo("f"); //char const*
foo(std::string()); //std::string
}
I2luY2x1ZGUgPGN4eGFiaS5oPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGNzdGRsaWI+CgpzdGQ6OnN0cmluZyBkZW1hbmdsZShjb25zdCBjaGFyKiBtYW5nbGVkKQp7CiAgICAgIGludCBzdGF0dXM7CiAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10sIHZvaWQgKCopKHZvaWQqKT4gcmVzdWx0KAogICAgICAgIGFiaTo6X19jeGFfZGVtYW5nbGUobWFuZ2xlZCwgMCwgMCwgJnN0YXR1cyksIHN0ZDo6ZnJlZSk7CiAgICAgIHJldHVybiByZXN1bHQuZ2V0KCkgPyBzdGQ6OnN0cmluZyhyZXN1bHQuZ2V0KCkpIDogImVycm9yIG9jY3VycmVkIjsKfQoKdGVtcGxhdGU8Y2xhc3MgVD4Kdm9pZCBmb28oVCB0KSB7IHN0ZDo6Y291dCA8PCBkZW1hbmdsZSh0eXBlaWQodCkubmFtZSgpKSA8PCBzdGQ6OmVuZGw7IH0KCmludCBtYWluKCkgewogICAgZm9vKCJmIik7ICAgICAgICAgICAgLy9jaGFyIGNvbnN0KgogICAgZm9vKHN0ZDo6c3RyaW5nKCkpOyAgLy9zdGQ6OnN0cmluZwp9Cg==