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

C++ std::is_scalar 템플릿 완벽 정리: 스칼라 타입 판별 방법


이 글에서는 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)을 다룰 때 꼭 알아두면 좋습니다.