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

Template is_unsigned trong C++ STL

std::is_unsigned (header <type_traits>) kiểm tra xem kiểu T có phải là kiểu số nguyên không dấu (unsigned integer type) hay không.

Kiểu unsigned trong C++

  • unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long.
  • uint8_t, uint16_t, uint32_t, uint64_t (từ <cstdint>).
  • std::size_t, std::uintptr_t.

Lưu ý: char có thể signed hoặc unsigned tùy implementation, nhưng unsigned char luôn unsigned.

Cú pháp

template <class T> struct is_unsigned;

Ví dụ 1: Kiểm tra các kiểu

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

class TP { };
enum TP_1 : int { };
enum class TP_2 : int { };

int main() {
    cout << boolalpha;
    cout << "Kiểm tra is_unsigned:\n";
    cout << "int:           " << is_unsigned<int>::value << '\n';           // false
    cout << "TP (class):    " << is_unsigned<TP>::value << '\n';            // false
    cout << "TP_1 (enum):   " << is_unsigned<TP_1>::value << '\n';          // false (enum có underlying signed)
    cout << "TP_2 (enum class): " << is_unsigned<TP_2>::value << '\n';      // false
    return 0;
}

Đầu ra

Kiểm tra is_unsigned:
int:           false
TP (class):    false
TP_1 (enum):   false
TP_2 (enum class): false

Ví dụ 2: Kiểu unsigned thực sự

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

int main() {
    cout << boolalpha;
    cout << "float:              " << is_unsigned<float>::value << '\n';              // false (fp không signed/unsigned)
    cout << "signed int:         " << is_unsigned<signed int>::value << '\n';         // false
    cout << "unsigned int:       " << is_unsigned<unsigned int>::value << '\n';       // true
    cout << "double:             " << is_unsigned<double>::value << '\n';             // false
    cout << "uint8_t:            " << is_unsigned<uint8_t>::value << '\n';            // true
    cout << "size_t:             " << is_unsigned<size_t>::value << '\n';             // true
    cout << "unsigned long long: " << is_unsigned<unsigned long long>::value << '\n'; // true
    return 0;
}

Đầu ra

float:              false
signed int:         false
unsigned int:       true
double:             false
uint8_t:            true
size_t:             true
unsigned long long: true

Mối quan hệ với is_signed

Kiểuis_signedis_unsignedGhi chú
Signed integer (int, long...)truefalse
Unsigned integer (unsigned int...)falsetrue
Floating-point (float, double)truefalseCó dấu âm/dương
Class, enum, pointer, voidfalsefalseKhông áp dụng
boolfalsefalseĐặc biệt
char (implementation-defined)??Kiểm tra signed_char/unsigned_char

Ứng dụng

  • Template constraints: Chỉ chấp nhận unsigned integer cho index, size, bitmask.
  • Static assert: static_assert(is_unsigned_v<T>, "T must be unsigned");.
  • Chuyển đổi an toàn: Tránh signed/unsigned mismatch warning.

Lưu ý

  • Chỉ có ý nghĩa với integer types. Floating-point luôn is_signed=true, is_unsigned=false (vì có dấu).
  • Enum: Phụ thuộc underlying type. enum E : unsigned int → is_unsigned_v<E> == true (C++11).
  • C++20: Concept std::unsigned_integral.