Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

instanceof에 해당하는 C++

<시간/>

C++에는 하나의 개체가 일부 클래스 유형의 인스턴스인지 확인하는 직접적인 방법이 없습니다. 자바에서는 이런 종류의 기능을 얻을 수 있습니다.

C++11에서는 is_base_of라는 항목을 찾을 수 있습니다. 이것은 주어진 클래스가 주어진 객체의 베이스인지 아닌지를 검사할 것입니다. 그러나 이것은 주어진 클래스 인스턴스가 해당 기능을 사용하는지 여부를 확인하지 않습니다.

"instanceof"와 유사한 가능한 가장 가까운 기능은 dynamic_cast (expression)을 사용하여 얻을 수 있습니다. . 이것은 주어진 값을 지정된 유형으로 변환하려고 시도하고 결과를 리턴합니다. 캐스트가 실패하면 null 포인터를 반환합니다. 이것은 다형성 포인터와 컴파일러 RTTI가 활성화된 경우에만 작동합니다.

예시 코드

#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;
   }
}

출력

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