이 글에서는 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를 반환한다는 점에 유의하세요.