Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

C++ เทียบเท่ากับ instanceof


C++ ไม่มีวิธีการตรวจสอบโดยตรงว่าวัตถุใดเป็นอินสแตนซ์ของคลาสบางประเภทหรือไม่ ใน Java เราสามารถมีสิ่งอำนวยความสะดวกประเภทนี้ได้

ใน C++11 เราจะพบรายการหนึ่งที่เรียกว่า is_base_of สิ่งนี้จะตรวจสอบว่าคลาสที่กำหนดเป็นฐานของวัตถุที่กำหนดหรือไม่ แต่สิ่งนี้ไม่ได้ตรวจสอบว่าอินสแตนซ์ของคลาสที่กำหนดใช้ฟังก์ชันนั้นหรือไม่

ฟังก์ชันการทำงานที่ใกล้ที่สุดที่คล้ายกับ "instanceof" สามารถทำได้โดยใช้ dynamic_cast (expression) . สิ่งนี้พยายามปกปิดค่าที่กำหนดเป็นประเภทที่ระบุและส่งกลับผลลัพธ์ ถ้าโยนไม่สำเร็จจะส่งกลับตัวชี้ null ใช้ได้เฉพาะกับพอยน์เตอร์ polymorphic และเมื่อเปิดใช้งานคอมไพเลอร์ 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