ในบทความนี้ เราจะพูดถึงการทำงาน ไวยากรณ์ และตัวอย่างของเทมเพลต 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