std::is_scalar (header <type_traits>) kiểm tra xem kiểu T có phải là kiểu scalar (kiểu vô hướng) hay không. Kiểu scalar là kiểu không phải class, không phải array, không phải reference - tức là kiểu dữ liệu đơn giản, cơ bản.
Định nghĩa Scalar Type
Scalar type bao gồm:
- Arithmetic types: integral (int, char, bool...), floating-point (float, double).
- Pointer types:
T*,T* const, v.v. - Pointer-to-member types:
int Class::*. - Enumeration types:
enum,enum class. std::nullptr_t.
KHÔNG phải scalar: class, struct, union, array, function, reference (lvalue/rvalue), void.
Cú pháp
template <class T> struct is_scalar;
Ví dụ kiểm tra
#include <iostream>
#include <type_traits>
using namespace std;
class TP { };
enum class Color { Red, Green, Blue };
int main() {
cout << boolalpha;
cout << "Kiểm tra is_scalar:\n";
// Arithmetic
cout << "int: " << is_scalar<int>::value << '\n'; // true
cout << "float: " << is_scalar<float>::value << '\n'; // true
cout << "double: " << is_scalar<double>::value << '\n'; // true
cout << "char: " << is_scalar<char>::value << '\n'; // true
cout << "bool: " << is_scalar<bool>::value << '\n'; // true
// Pointer
cout << "int*: " << is_scalar<int*>::value << '\n'; // true
cout << "const int*: " << is_scalar<const int*>::value << '\n'; // true
cout << "void*: " << is_scalar<void*>::value << '\n'; // true
// Member pointer
cout << "int TP::*: " << is_scalar<int TP::*>::value << '\n'; // true
// Enum
cout << "Color: " << is_scalar<Color>::value << '\n'; // true
cout << "enum int: " << is_scalar<int>::value << '\n'; // true (enum thường chuyển ngầm sang int)
// KHÔNG phải scalar
cout << "TP (class): " << is_scalar<TP>::value << '\n'; // false
cout << "int[10]: " << is_scalar<int[10]>::value << '\n'; // false (array)
cout << "int&: " << is_scalar<int&>::value << '\n'; // false (lvalue ref)
cout << "int&&: " << is_scalar<int&&>::value << '\n'; // false (rvalue ref)
cout << "void: " << is_scalar<void>::value << '\n'; // false
cout << "function: " << is_scalar<void()>::value << '\n'; // false
return 0;
}
Đầu ra
Kiểm tra is_scalar: int: true float: true double: true char: true bool: true int*: true const int*: true void*: true int TP::*: true Color: true enum int: true TP (class): false int[10]: false int&: false int&&: false void: false function: false
Mối quan hệ
is_scalar ≡ is_arithmetic || is_pointer || is_member_pointer || is_enum || is_same
Ứng dụng
- Template constraints: chỉ chấp nhận scalar type (ví dụ: atomic operations).
- SFINAE: enable_if cho overload chỉ làm việc với scalar.
- Kiểm tra kiểu trong metaprogramming: phân loại kiểu dữ liệu.
Lưu ý
std::is_scalar khác với khái niệm "scalar" trong toán học/vectơ. Trong C++, nó chỉ đơn thuần là "kiểu không phải hợp chất (non-compound type)".