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

Template is_standard_layout ใน C++

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