이 글에서는 C++ STL에서 제공하는 std::is_scalar 템플릿의 동작 원리, 문법, 그리고 실제 사용 예제를 살펴보겠습니다.
is_scalar는 <type_traits> 헤더 파일에 정의된 템플릿으로, 주어진 타입 T가 스칼라(scalar) 타입인지 여부를 확인하는 데 사용됩니다.
이 템플릿은 is_arithmetic(산술 타입), is_pointer(포인터), is_enum(열거형), is_member_pointer(멤버 포인터) 등의 타입 특성을 조합한 것으로, 이들 중 하나라도 참이면 is_scalar의 결과 역시 참이 됩니다.
C++에서 스칼라 타입이란?
스칼라 타입은 클래스 타입도 아니고 배열 타입도 아닌 객체를 의미합니다. 쉽게 말해, 오버로딩 없이 덧셈 연산자(+ )가 기본적으로 내장되어 있는 타입입니다. 대표적인 스칼라 타입으로는 정수형(int), 부동소수점형(float, double), 불리언(bool), 포인터, 열거형(enum), 멤버 포인터 등이 있습니다.
문법
template <class T> is_scalar;
매개변수
이 템플릿은 타입 T 한 개만을 매개변수로 받아, 해당 타입이 스칼라 타입인지 아닌지를 검사합니다.
반환 값
불리언(Boolean) 값을 반환하며, 주어진 타입이 스칼라 타입이면 true, 그렇지 않으면 false를 반환합니다.
예제 1: 기본 사용법
입력: is_scalar<int>::value; 출력: True 입력: is_scalar<A>::value; // A가 클래스 객체라고 가정 출력: False
코드 예제
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
class TP {
};
cout << boolalpha;
cout << "checking for is_scalar: ";
cout << "\nint(TP::*): "<< is_scalar<int(TP::*)>::value;
cout << "\nint *: "<< is_scalar<int*>::value;
cout << "\nbool: "<< is_scalar<bool>::value;
cout << "\nint(int): "<< is_scalar<int(int)>::value;
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
checking for is_scalar: int(TP::*): true int *: true bool: true int(int): false
결과 분석: 클래스 TP의 멤버 포인터인 int(TP::*)와 일반 포인터 int*는 스칼라 타입에 해당하므로 true가 출력됩니다. bool 역시 산술 타입이기 때문에 true입니다. 반면 함수 타입 int(int)는 스칼라 타입이 아니므로 false가 출력됩니다.
예제 2: 다양한 타입 검사
#include <iostream>
#include <type_traits>
using namespace std;
int main() {
class TP {
};
enum class TP_1 {
var_1,
var_2,
var_3,
var4
};
cout << boolalpha;
cout << "checking for is_scalar: ";
cout << "\nTP : "<< is_scalar<int(TP)>::value;
cout << "\nTP_1: "<< is_scalar<TP_1>::value;
cout << "\nint[10] "<< is_scalar<int[10]>::value;
cout << "\nint&: "<< is_scalar<int&>::value;
cout << "\nchar&: "<< is_scalar<char&>::value;
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
checking for is_scalar: TP : false TP_1: true int[10] false int&: false char&: false
결과 분석: 클래스 타입 TP는 스칼라 타입이 아니므로 false입니다. 반면 enum class로 선언한 TP_1은 열거형이므로 스칼라 타입에 해당하여 true가 출력됩니다. 배열 타입 int[10]과 참조 타입인 int&, char&는 모두 스칼라 타입이 아니기 때문에 false가 반환됩니다.
정리
std::is_scalar는 컴파일 시점에 타입이 스칼라인지 판별할 수 있는 유용한 도구입니다. 템플릿 메타프로그래밍이나 SFINAE, if constexpr 같은 조건부 로직에서 타입에 따라 다른 동작을 구현할 때 널리 활용되므로, C++ 타입 특성(type traits)을 다룰 때 꼭 알아두면 좋습니다.