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

Template is_scalar trong C++ STL

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)".