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?
The typeid operator returns an lvalue of type const std::type_info that represents the type of expression expr. You must include the standard template library header <typeinfo> to use the typeid operator. Classes A and B are polymorphic; classes C and D are not.
typeid( object ); The typeid operator is used to determine the class of an object at runtime. It returns a reference to a std::type_info object, which exists until the end of the program, that describes the "object".
The typeid keyword is a unary operator that yields run-time type information about its operand if the operand's type is a polymorphic class type. It returns an lvalue of type const std::type_info .
The class type_info holds implementation-specific information about a type, including the name of the type and means to compare two types for equality or collating order. This is the class returned by the typeid operator. The type_info class is neither CopyConstructible nor CopyAssignable.
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*
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With