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

Template is_void trong C++ STL

std::is_void (header <type_traits>) kiểm tra xem kiểu T có phải là void hay không (bao gồm void, const void, volatile void, const volatile void).

Cú pháp

template <class T> struct is_void;

Ví dụ kiểm tra

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

int main() {
    cout << boolalpha;
    cout << "Kiểm tra is_void:\n";
    
    cout << "void:                 " << is_void<void>::value << '\n';                 // true
    cout << "const void:           " << is_void<const void>::value << '\n';           // true
    cout << "volatile void:        " << is_void<volatile void>::value << '\n';        // true
    cout << "const volatile void:  " << is_void<const volatile void>::value << '\n';  // true
    
    cout << "int:                  " << is_void<int>::value << '\n';                  // false
    cout << "char:                 " << is_void<char>::value << '\n';                 // false
    cout << "double:               " << is_void<double>::value << '\n';               // false
    cout << "float:                " << is_void<float>::value << '\n';                // false
    cout << "int*:                 " << is_void<int*>::value << '\n';                 // false
    cout << "void*:                " << is_void<void*>::value << '\n';                // false (con trỏ void, không phải void)
    
    return 0;
}

Đầu ra

Kiểm tra is_void:
void:                 true
const void:           true
volatile void:        true
const volatile void:  true
int:                  false
char:                 false
double:               false
float:                false
int*:                 false
void*:                false

Ý nghĩa của void

  • Void type: "Rỗng", "không có giá trị". Dùng cho hàm không trả về giá trị.
  • Void pointer (void*): Con trỏ chung, có thể trỏ đến bất kỳ kiểu object nào. Phải ép kiểu trước khi dereference.
  • is_void chỉ true cho chính kiểu void (với cv-qualifier), KHÔNG cho void*.

Ứng dụng

  • Template metaprogramming: Đặc biệt hóa cho void type.
  • SFINAE: enable_if_t<!is_void_v<T>> để loại trừ void.
  • Type traits composition: Kết hợp với is_function, is_object.

Mối quan hệ

is_void → true chỉ cho void, const void, volatile void, const volatile void
is_object → true cho mọi object type (non-function, non-reference, non-void)
is_function → true cho function type
// Phân vùng: void, function, object (scalar, array, class, union)

Lưu ý

  • void là incomplete type - không thể khai báo biến kiểu void, không thể sizeof(void).
  • Dùng void làm return type, parameter type (chỉ trong template), hoặc pointer target.