Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ is_unsigned 템플릿 완벽 정리: 부호 없는 타입 확인 방법과 예제

이 글에서는 C++ STL의 std::is_unsigned 템플릿의 동작 원리, 문법, 그리고 실제 활용 예제를 살펴보겠습니다.

is_unsigned<type_traits> 헤더 파일에 정의된 템플릿으로, 컴파일 시점에 주어진 타입 T가 부호 없는(unsigned) 타입인지 여부를 확인하는 데 사용됩니다.

C++에서 부호 없는 데이터 타입이란?

부호 없는 데이터 타입은 값이 음수가 될 수 없음을 전제로 사용하는 타입입니다. 대표적으로 학번, 제품 ID, 나이처럼 음수가 의미가 없는 데이터를 다룰 때 유용합니다.

타입을 부호 없는 형식으로 선언하려면 데이터 타입 앞에 unsigned 키워드를 붙이면 됩니다.

unsigned int;
unsigned long;

참고로 unsigned는 정수 계열 타입에만 적용할 수 있으며, floatdouble 같은 부동소수점 타입에는 사용할 수 없습니다.

문법

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 inttrue를 반환하고, 나머지 타입은 모두 false를 반환합니다. 이처럼 std::is_unsigned는 템플릿 메타프로그래밍이나 조건부 컴파일(if constexpr, SFINAE 등)에서 타입 특성에 따라 분기 처리할 때 매우 유용하게 활용됩니다.