이 글에서는 C++ STL의 std::is_unsigned 템플릿의 동작 원리, 문법, 그리고 실제 활용 예제를 살펴보겠습니다.
is_unsigned는 <type_traits> 헤더 파일에 정의된 템플릿으로, 컴파일 시점에 주어진 타입 T가 부호 없는(unsigned) 타입인지 여부를 확인하는 데 사용됩니다.
C++에서 부호 없는 데이터 타입이란?
부호 없는 데이터 타입은 값이 음수가 될 수 없음을 전제로 사용하는 타입입니다. 대표적으로 학번, 제품 ID, 나이처럼 음수가 의미가 없는 데이터를 다룰 때 유용합니다.
타입을 부호 없는 형식으로 선언하려면 데이터 타입 앞에 unsigned 키워드를 붙이면 됩니다.
unsigned int;
unsigned long;
참고로 unsigned는 정수 계열 타입에만 적용할 수 있으며, float나 double 같은 부동소수점 타입에는 사용할 수 없습니다.
문법
template <class T> is_unsigned;
매개변수
이 템플릿은 타입 매개변수 T 하나만 받으며, 해당 T가 부호 없는 타입인지 검사합니다.
반환값
불리언(Boolean) 값을 반환합니다. 주어진 타입이 부호 없는 타입이면 true, 그렇지 않으면 false를 반환합니다.
예제
입력: is_unsigned<unsigned int>::value;
출력: true
입력: is_unsigned<int>::value;
출력: false
예제 코드 1: 클래스와 열거형 타입 검사
#include <iostream>
#include <type_traits>
using namespace std;
class TP {
};
enum TP_1 : int {};
enum class TP_2 : int {};
int main() {
cout << boolalpha;
cout << "checking for is_unsigned:";
cout << "\nint:" << is_unsigned<int>::value;
cout << "\nTP:" << is_unsigned<TP>::value;
cout << "\nTP_1:" << is_unsigned<TP_1>::value;
cout << "\nTP_2:" << is_unsigned<TP_2>::value;
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
checking for is_unsigned:
int: false
TP: false
TP_1: false
TP_2: false
기본 int, 사용자 정의 클래스, 그리고 기반 타입이 int인 열거형들은 모두 부호 있는(signed) 타입으로 간주되므로 모두 false가 출력됩니다.
예제 코드 2: 다양한 산술 타입 검사
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
cout << boolalpha;
cout << "checking for is_unsigned:";
cout << "\nfloat:" << is_unsigned<float>::value;
cout << "\nSigned int:" << is_unsigned<signed int>::value;
cout << "\nUnsigned int:" << is_unsigned<unsigned int>::value;
cout << "\ndouble:" << is_unsigned<double>::value;
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
checking for is_unsigned:
float: false
Signed int: false
Unsigned int: true
double: false
결과에서 볼 수 있듯이 명시적으로 unsigned로 선언된 unsigned int만 true를 반환하고, 나머지 타입은 모두 false를 반환합니다. 이처럼 std::is_unsigned는 템플릿 메타프로그래밍이나 조건부 컴파일(if constexpr, SFINAE 등)에서 타입 특성에 따라 분기 처리할 때 매우 유용하게 활용됩니다.