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ểu | is_signed | is_unsigned | Ghi chú |
|---|---|---|---|
| Signed integer (int, long...) | true | false | |
| Unsigned integer (unsigned int...) | false | true | |
| Floating-point (float, double) | true | false | Có dấu âm/dương |
| Class, enum, pointer, void | false | false | Không áp dụng |
| bool | false | false | Đặ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.