typeid() returns extra characters in g++
-
16-09-2019 - |
Question
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
Above code prints P3foo on my ubuntu machine with g++. I am not getting why it is printing P3foo instead of just foo. If I change the code like
std::cout << typeid(*this).name() << std::endl;
it prints 3foo.
Any thoughts?
Solution
Because it is a pointer to foo. And foo has 3 characters. So it becomes P3foo
. The other one has type foo
, so it becomes 3foo
. Note that the text is implementation dependent, and in this case GCC just gives you the internal, mangled name.
Enter that mangled name into the program c++filt
to get the unmangled name:
$ c++filt -t P3foo
foo*
OTHER TIPS
std::type_info::name()
returns an implementation specific name. AFAIK, there is no portable way to get a "nice" name, although GCC has one. Look at abi::__cxa_demangle()
.
int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
Is there a portable solution
workaround would be to make a template hack to return all harcoded type names as char*
which platform dont have #include <cxxabi.h>
?