Search code examples
c++visual-c++rttitypeidtypeinfo

Can type_info pointers be used to distingush types in C++?


I have a set of polymorphic C++ classes and they are all instantiated by the same module (Windows DLL). Now having two pointers to such classes and having called typeid:

SomeCommonBase* first = ...; //valid pointer
SomeCommonBase* second = ...; //valid pointer
const type_info& firstInfo = typeid( first );
const type_info& secondInfo = typeid( second );

can I compare retrieved type_info addresses

if( &firstInfo == &secondInfo ) {
   //objects are of the same class
} else {
   //objects are of different classes
}

or use ==

if( firstInfo == secondInfo ) {
   //objects are of the same class
} else {
   //objects are of different classes
}

to detect whether objects are of (exactly) the same class or of different classes? Is it guaranteed to work when objects are instantiated from within the same module?


Solution

  • As I'm writing this, your code is

    SomeCommonBase* first = ...; //valid pointer
    SomeCommonBase* second = ...; //valid pointer
    type_info& firstInfo = typeid( first );
    type_info& secondInfo = typeid( second );
    

    It should not compile because typeid returns a reference to const.

    Worse, you are asking for type info about the pointers. Both pointers are of type SomeCommonBase*, so you're guaranteed that they are of the same type. Ask instead for type info about the pointed to objects.

    That said, as @DeadMg remarked, you also need to use operator== to compare type info objects.

    The C++ standard does not address the issue of dynamic libraries. But within any given Windows module you should be safe.

    Cheers & hth.,