Trang tài liệu
Khóa học C++ nền tảng
Chương 12. Mẫu (Template)
Type traits

Type traits

Type traits là một tập hợp các lớp mẫu trong C++ giúp lấy thông tin về thuộc tính, hành vi hoặc đặc điểm của kiểu. Bạn có thể tìm thấy chúng trong tệp tiêu đề <type_traits>. Bằng cách sử dụng Type traits, bạn có thể điều chỉnh mã code của mình tùy thuộc vào các thuộc tính của một kiểu nhất định hoặc thậm chí thực thi các thuộc tính cụ thể cho các tham số kiểu của bạn trong mã code mẫu.

Một số type traits phổ biến là:

  • std::is_pointer: Kiểm tra xem kiểu đã cho có phải là kiểu con trỏ hay không.
  • std::is_arithmetic: Kiểm tra xem kiểu đã cho có phải là kiểu số học hay không.
  • std::is_function: Kiểm tra xem kiểu đã cho có phải là kiểu hàm hay không.
  • std::decay: Áp dụng quy tắc decltype cho kiểu đầu vào (tham chiếu dải, bộ định tính cv, v.v.).

Sử dụng

Bạn có thể sử dụng type traits như sau:

#include <iostream>
#include <type_traits>
 
int main() {
    int a;
    int* a_ptr = &a;
 
    std::cout << "Is 'a' a pointer? " << std::boolalpha << std::is_pointer<decltype(a)>::value << std::endl;
    std::cout << "Is 'a_ptr' a pointer? " << std::boolalpha << std::is_pointer<decltype(a_ptr)>::value << std::endl;
 
    return 0;
}

Các loại Type traits

Một số type traits giúp bạn tổng hợp các traits khác hoặc sửa đổi chúng, chẳng hạn như:

  • std::conditional: Nếu một giá trị boolean đã cho là true, hãy sử dụng kiểu A; nếu không, hãy sử dụng kiểu B.
  • std::enable_if: Nếu một giá trị boolean đã cho là true, hãy sử dụng kiểu A; mặt khác, không có kiểu lồng nhau.
#include <iostream>
#include <type_traits>
 
template <typename T>
typename std::enable_if<std::is_arithmetic<T>::value, T>::type find_max(T a, T b) {
    return a > b ? a : b;
}
 
int main() {
    int max = find_max(10, 20);
    std::cout << "Max: " << max << std::endl;
 
    return 0;
}

Trong ví dụ này, hàm mẫu find_max chỉ được xác định khi T là một loại số học (ví dụ: int, float, double). Điều này ngăn việc sử dụng hàm find_max ngoài ý muốn với các kiểu phi số học.

Nhìn chung, type traits là một công cụ mạnh mẽ để tạo mã code C++ chung, có thể mở rộng và hiệu quả hơn, cung cấp một cách để truy vấn và điều chỉnh mã code của bạn dựa trên type traits.