ในบทความนี้ เราจะพูดถึงการทำงาน ไวยากรณ์ และตัวอย่างของ template std::is_standard_layout ใน C++ STL
is_standard_layout เป็น template ใน header <type_traits> ใช้ตรวจสอบว่าชนิด T เป็น standard layout หรือไม่
Standard Layout ใน C++ คืออะไร?
Standard Layout type คือชนิดที่มีโครงสร้างเชิงเส้นแบบง่าย (เหมือน array) และ access control ที่ใช้สื่อสารกับโปรแกรมภาษาอื่นได้ง่าย เป็นชนิดที่เขียนด้วยแนวคิด one code for all languages
Standard layout class มีลักษณะ:
- ไม่มี virtual function หรือ virtual classes
- ต้องมี access control เดียวกัน (public, private, protected) สำหรับทุกคลาส
- ไม่มี non-static data types
- ไม่มี base class ที่มีชนิดเดียวกับ non-static data type แรก
ไวยากรณ์
template <class T> is_standard_layout;
พารามิเตอร์
Template รับพารามิเตอร์ชนิด T เพียงอย่างเดียว ตรวจสอบว่าเป็น standard layout type หรือไม่
ค่าที่คืน
คืนค่า Boolean: true หากเป็น standard layout type, false หากไม่ใช่
ตัวอย่าง
Input: is_standard_layout<int>::value; Output: true
Input: class A{ int a; }; class B : public A { int b; }; is_standard_layout<B>::value; Output: false
ตัวอย่างโค้ด 1
#include <iostream>
#include <type_traits>
using namespace std;
class TP { int var; };
struct TP_2 { int var; private: int var_2; };
union TP_3 { };
int main() {
cout << boolalpha;
cout << "checking for is_standard_layout template for class : " << is_standard_layout<TP>::value;
cout << "\nchecking for is_standard_layout template for structure: " << is_standard_layout<TP_2>::value;
cout << "\nchecking for is_standard_layout template for union : " << is_standard_layout<TP_3>::value;
cout << "\nchecking for is_standard_layout template for char : " << is_standard_layout<char>::value;
cout << "\nchecking for is_standard_layout template for int : " << is_standard_layout<int>::value;
return 0;
}
เอาต์พุต
checking for is_standard_layout template for class : true checking for is_standard_layout template for structure: false checking for is_standard_layout template for union : true checking for is_standard_layout template for char : true checking for is_standard_layout template for int : true
ตัวอย่างโค้ด 2
#include <iostream>
#include <type_traits>
using namespace std;
class TP { int var; };
class TP_2 { int var; private: int var_2; };
class TP_3 { };
int main() {
cout << boolalpha;
cout << "checking for is_standard_layout template for class with one variable : " << is_standard_layout<TP>::value;
cout << "\nchecking for is_standard_layout template for class with one private variable: " << is_standard_layout<TP_2>::value;
cout << "\nchecking for is_standard_layout template for class with no variable : " << is_standard_layout<TP_3>::value;
cout << "\nchecking for is_standard_layout template for int * : " << is_standard_layout<int*>::value;
cout << "\nchecking for is_standard_layout template for float : " << is_standard_layout<float>::value;
return 0;
}
เอาต์พุต
checking for is_standard_layout template for class with one variable : true checking for is_standard_layout template for class with one private variable: true checking for is_standard_layout template for class with no variable : true checking for is_standard_layout template for int * : true checking for is_standard_layout template for float : true