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ểu | is_class | Ghi chú |
|---|---|---|
class A { }; | true | Class type |
struct B { }; | true | Struct là class type |
union C { }; | false | Union KHÔNG phải class type |
enum D { }; | false | Enum không phải class |
int, float, void | false | Kiểu cơ bản |
int*, int& | false | Pointer, 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_classtrả vềfalsecho 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_classORstd::is_union. - C++20: Concept
std::is_classkhông có, nhưng có thể tự định nghĩa.