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

C++ std::is_signed 템플릿 완벽 가이드: 부호 있는 타입 검사 방법

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

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

부호 있는 타입이란?

부호 있는 타입은 음수와 양수 값을 모두 표현할 수 있는 기본 산술 타입을 의미합니다. 모든 산술 데이터 타입은 부호 있는(signed) 타입과 부호 없는(unsigned) 타입 둘 중 하나에 속합니다.

예를 들어, 음수 값을 표현해야 할 때 부호 있는 타입을 사용합니다.

  • -1은 부호 있는 int
  • -1.009는 부호 있는 float

기본적으로 모든 정수 타입은 부호 있는 타입이며, 이를 부호 없는 타입으로 바꾸려면 타입 이름 앞에 unsigned 키워드를 붙여야 합니다.

문법(Syntax)

template <class T> is_signed;

매개변수(Parameters)

이 템플릿은 단 하나의 매개변수 T만 받으며, 해당 타입이 부호 있는 타입인지 아닌지를 검사합니다.

반환 값(Return Value)

불리언(Boolean) 값을 반환합니다.

  • true: 주어진 타입이 부호 있는 타입인 경우
  • false: 주어진 타입이 부호 있는 타입이 아닌 경우

예제 1: 기본 사용법

Input: is_signed<int>::value;
Output: True

Input: is_signed<unsigned int>::value;
Output: False

예제 2: 클래스 및 열거형 타입 검사

#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_signed:";
    cout << "\nint:" << is_signed<int>::value;
    cout << "\nTP:" << is_signed<TP>::value;
    cout << "\nTP_1:" << is_signed<TP_1>::value;
    cout << "\nTP_2:" << is_signed<TP_2>::value;
    return 0;
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

checking for is_signed:
Int: true
TP: false
TP_1: false
TP_2: false

클래스나 열거형(enum)처럼 부호 개념이 적용되지 않는 타입에는 false가 반환되는 것을 확인할 수 있습니다.

예제 3: 부호 있는/없는 정수 및 부동소수점 타입 비교

#include <iostream>
#include <type_traits>
using namespace std;
int main() {
    cout << boolalpha;
    cout << "checking for is_signed:";
    cout << "\nfloat:" << is_signed<float>::value;
    cout << "\nSigned int:" << is_signed<signed int>::value;
    cout << "\nUnsigned int:" << is_signed<unsigned int>::value;
    cout << "\ndouble:" << is_signed<double>::value;
    return 0;
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

checking for is_signed:
Float: true
Signed int: true
Unsigned int: false
Double: true

float, double과 같은 부동소수점 타입은 항상 부호 있는 타입으로 간주되며, unsigned로 명시적으로 선언된 정수 타입만 false를 반환한다는 점에 유의하세요.