Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Template is_class trong C++ STL

std::is_class (header <type_traits>) kiểm tra xem kiểu T có phải là kiểu lớp (class type) hay không. Bao gồm class, struct, union? Không - union KHÔNG phải class type theo định nghĩa trait này.

Cú pháp

template <class T> struct is_class;

Phân loại

Kiểuis_classGhi chú
class A { };trueClass type
struct B { };trueStruct là class type
union C { };falseUnion KHÔNG phải class type
enum D { };falseEnum không phải class
int, float, voidfalseKiểu cơ bản
int*, int&falsePointer, reference

Ví dụ 1: Class, Struct, Union

#include <iostream>
#include <type_traits>
using namespace std;

class TP_1 { };
union TP_2 { int var_1; float var_2; };

int main() {
    cout << boolalpha;
    cout << "TP_1 (class): " << is_class<TP_1>::value << '\n'; // true
    cout << "TP_2 (union): " << is_class<TP_2>::value << '\n'; // false
    return 0;
}

Đầu ra

TP_1 (class): true
TP_2 (union): false

Ví dụ 2: Class, Struct, Union có thành viên

#include <iostream>
#include <type_traits>
using namespace std;

class TP_1 { int v1; float v2; char v3; };
union TP_2 { int v1; float v2; char v3; };
struct TP_3 { int v1; float v2; char v3; };

int main() {
    cout << boolalpha;
    cout << "TP_1 (class):  " << is_class<TP_1>::value << '\n'; // true
    cout << "TP_2 (union):  " << is_class<TP_2>::value << '\n'; // false
    cout << "TP_3 (struct): " << is_class<TP_3>::value << '\n'; // true
    return 0;
}

Đầu ra

TP_1 (class):  true
TP_2 (union):  false
TP_3 (struct): true

Ứng dụng

  • SFINAE: Enable overload chỉ cho class type (ví dụ: serialize class).
  • Static assert: static_assert(is_class_v<T>, "T must be a class");.
  • Phân loại kiểu trong reflection/traits library.

Mối quan hệ

is_class ≡ is_union ? false : (is_class_or_union && !is_union)
// Thực tế: is_class true cho class và struct, false cho union

Lưu ý

  • is_class trả về false cho union - đây là điểm khác biệt so với khái niệm "class type" trong ngữ pháp C++ (union là class type về mặt ngữ pháp nhưng trait này trả về false).
  • Để kiểm tra "class hoặc struct hoặc union", dùng std::is_class OR std::is_union.
  • C++20: Concept std::is_class không có, nhưng có thể tự định nghĩa.