#include <iostream>
#include <string>
#include <typeinfo>
#include <cstdlib>
#include <memory>
#include <cxxabi.h>
template <typename T> std::string TypeName(const T &)
{
auto name = typeid(T).name();
int status = -4;
std::unique_ptr<char, void(*)(void*)> res {
abi::__cxa_demangle(name, NULL, NULL, &status),
std::free
};
return (status==0) ? res.get() : name ;
}
template <typename char_type, size_t LENGTH>
std::basic_string<char_type> literal(const char (&value)[LENGTH])
{
using string = std::basic_string<char_type>;
string result{};
result.reserve(LENGTH);
std::copy(std::begin(value), std::end(value), std::back_inserter(result));
return result;
}
int main()
{
std::cout << TypeName(literal<char>("test")) << '\n';
std::cout << TypeName(literal<char32_t>("test")) << '\n';
std::cout << TypeName(literal<char16_t>("test")) << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKI2luY2x1ZGUgPHR5cGVpbmZvPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGN4eGFiaS5oPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6c3RyaW5nIFR5cGVOYW1lKGNvbnN0IFQgJikKewoJYXV0byBuYW1lID0gdHlwZWlkKFQpLm5hbWUoKTsKCWludCBzdGF0dXMgPSAtNDsKCXN0ZDo6dW5pcXVlX3B0cjxjaGFyLCB2b2lkKCopKHZvaWQqKT4gcmVzIHsKCQlhYmk6Ol9fY3hhX2RlbWFuZ2xlKG5hbWUsIE5VTEwsIE5VTEwsICZzdGF0dXMpLAoJCXN0ZDo6ZnJlZQoJfTsKICAgIHJldHVybiAoc3RhdHVzPT0wKSA/IHJlcy5nZXQoKSA6IG5hbWUgOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgY2hhcl90eXBlLCBzaXplX3QgTEVOR1RIPgpzdGQ6OmJhc2ljX3N0cmluZzxjaGFyX3R5cGU+IGxpdGVyYWwoY29uc3QgY2hhciAoJnZhbHVlKVtMRU5HVEhdKQp7Cgl1c2luZyBzdHJpbmcgPSBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyX3R5cGU+OwoKCXN0cmluZyByZXN1bHR7fTsKCXJlc3VsdC5yZXNlcnZlKExFTkdUSCk7CgoJc3RkOjpjb3B5KHN0ZDo6YmVnaW4odmFsdWUpLCBzdGQ6OmVuZCh2YWx1ZSksIHN0ZDo6YmFja19pbnNlcnRlcihyZXN1bHQpKTsKCglyZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpCnsKCXN0ZDo6Y291dCA8PCBUeXBlTmFtZShsaXRlcmFsPGNoYXI+KCJ0ZXN0IikpIDw8ICdcbic7CglzdGQ6OmNvdXQgPDwgVHlwZU5hbWUobGl0ZXJhbDxjaGFyMzJfdD4oInRlc3QiKSkgPDwgJ1xuJzsKCXN0ZDo6Y291dCA8PCBUeXBlTmFtZShsaXRlcmFsPGNoYXIxNl90PigidGVzdCIpKSA8PCAnXG4nOwoKCXJldHVybiAwOwp9