C++ equivalent of instanceof

C++Server Side ProgrammingProgramming

C++ has no direct method to check one object is an instance of some class type or not. In Java, we can get this kind of facility.

In C++11, we can find one item called is_base_of<Base, T>. This will check if the given class is a base of the given object or not. But, this does not verify whether the given class instance uses that function. 

The nearest possible functionality similar to "instanceof" can be achieved using dynamic_cast <new-type>(expression). This tries to covert the given value into the specified type and returns the result. if the cast is unsuccessful this returns a null pointer. This works only for polymorphic pointers and when compiler RTTI is enabled.

Example Code

#include <iostream>
using namespace std;

template<typename Base, typename T>
inline bool instanceof(const T *ptr) {
   return dynamic_cast<const Base*>(ptr) != nullptr;
}

class Parent {
   public:
   virtual ~Parent() {}
   virtual void foo () { std::cout << "Parent\n"; }
};

class Child : public Parent {
   public:
   virtual void foo() { std::cout << "Child\n"; }
};

class AnotherClass{};
   int main() {

   Parent p;
   Child c;
   AnotherClass a;

   Parent *ptr1 = &p;
   Child *ptr2 = &c;
   AnotherClass *ptr3 = &a;

   if(instanceof<Parent>(ptr1)) {
      cout << "p is an instance of the class Parent" << endl;
   } else {
      cout << "p is not an instance of the class Parent" << endl;
   }

   if(instanceof<Parent>(ptr2)) {
      cout << "c is an instance of the class Parent" << endl;
   } else {
      cout << "c is not an instance of the class Parent" << endl;
   }

   if(instanceof<Child>(ptr2)) {
      cout << "c is an instance of the class Child" << endl;
   } else {
      cout << "c is not an instance of the class Child" << endl;
   }

   if(instanceof<Child>(ptr1)) {
      cout << "p is an instance of the class Child" << endl;
   } else {
      cout << "p is not an instance of the class Child" << endl;
   }

   if(instanceof<AnotherClass>(ptr2)) {
      cout << "c is an instance of AnotherClass class" << endl;
   } else {
      cout << "c is not an instance of AnotherClass class" << endl;
   }
}

Output

p is an instance of the class Parent
c is an instance of the class Parent
c is an instance of the class Child
p is not an instance of the class Child
c is not an instance of AnotherClass class
raja
Published on 28-May-2019 12:16:28

Advertisements