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

เทมเพลต is_abstract ใน C++


ในบทความนี้ เราจะพูดถึงการทำงาน ไวยากรณ์ และตัวอย่างของเทมเพลต std::is_abstract ใน C++ STL

เทมเพลต Is_abstract ช่วยตรวจสอบว่าคลาสนั้นเป็นคลาสนามธรรมหรือไม่

คลาสนามธรรมคืออะไร

คลาสนามธรรมคือคลาสที่มี Pure Virtual Function อย่างน้อยหนึ่งรายการ เราใช้คลาสนามธรรมเพราะเมื่อเรากำหนดฟังก์ชั่น เราไม่รู้ว่ามันใช้งานจริง ดังนั้นมันมีประโยชน์มากในกรณีที่เราไม่รู้ว่าฟังก์ชั่นของคลาสควรจะทำอะไรต่อไป แต่เรามั่นใจว่ามี ต้องเป็นฟังก์ชันแบบนี้ในระบบของเรา ดังนั้นเราจึงประกาศฟังก์ชันเสมือนแท้ที่มีการประกาศเท่านั้นและไม่มีการใช้งานฟังก์ชันนั้น

ดังนั้น เมื่อเราต้องการตรวจสอบจากอินสแตนซ์ของคลาสว่าคลาสนั้นเป็นคลาสนามธรรมหรือไม่ เราใช้ is_abstract()

is_abstract() สืบทอดมาจาก itegral_constant และให้ true_type หรือ false_type ขึ้นอยู่กับว่าอินสแตนซ์ของคลาส T เป็นประเภทคลาส polymorphic หรือไม่

ไวยากรณ์

template <class T> struct is_abstract;

พารามิเตอร์

เทมเพลตนี้สามารถมีพารามิเตอร์ T ได้เพียงตัวเดียว ซึ่งเป็นประเภทคลาสเพื่อตรวจสอบว่าคลาส Ti เป็นคลาสนามธรรมหรือไม่

คืนค่า

ฟังก์ชันนี้คืนค่าประเภทบูล จริงหรือเท็จ

คืนค่าจริงหาก T เป็นคลาสนามธรรม และคืนค่าเป็นเท็จหาก T ไม่ใช่คลาสนามธรรม

ตัวอย่าง

#include <iostream>
#include <type_traits>
using namespace std;
struct TP_1 {
   int var;
};
struct TP_2 {
   virtual void dummy() = 0;
};
class TP_3 : TP_2 {
};
int main() {
   cout << boolalpha;
   cout << "checking for is_abstract: ";
   cout << "\nstructure TP_1 with one variable :"<< is_abstract<TP_1>::value;
   cout << "\nstructure TP_2 with one virtual variable : "<< is_abstract<TP_2>::value;
   cout << "\nclass TP_3 which is derived from TP_2 structure : "<< is_abstract<TP_3>::value;
   return 0;
}

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

checking for is_abstract:
structure TP_1 with one variable : false
structure TP_2 with one virtual variable : true
class TP_3 which is derived from TP_2 structure : true

ตัวอย่าง

#include <iostream>
#include <type_traits>
using namespace std;
struct TP_1 {
   virtual void dummy() = 0;
};
class TP_2 {
   virtual void dummy() = 0;
};
struct TP_3 : TP_2 {
};
int main() {
   cout << boolalpha;
   cout << "checking for is_abstract: ";
   cout << "\nstructure TP_1 with one virtual function :"<< is_abstract<TP_1>::value;
   cout << "\nclass TP_2 with one virtual function : "<< is_abstract<TP_2>::value;
   cout << "\nstructure TP_3 which is derived from TP_2 class : "<< is_abstract<TP_3>::value;
   return 0;
}

ผลลัพธ์

หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -

checking for is_abstract:
structure TP_1 with one virtual function : true
class TP_2 with one virtual function : true
structure TP_3 which is derived from TP_2 class : true