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

C++ std::is_fundamental 템플릿 완벽 가이드: 기본 타입 검사 방법

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

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

기본 타입(Fundamental Type)이란?

기본 타입이란 컴파일러에 이미 내장되어 있는 타입을 의미합니다. 대표적으로 int, float, char, double, bool 등이 있으며, 이런 타입들을 흔히 내장(built-in) 데이터 타입이라고 부릅니다.

반면 사용자가 직접 정의한 타입, 즉 클래스(class), 열거형(enum), 구조체(struct)는 물론 참조자(reference)나 포인터(pointer) 같은 파생 형태 역시 기본 타입에 포함되지 않습니다.

문법

template <class T> is_fundamental;

매개변수

이 템플릿은 검사하고자 하는 타입 T를 매개변수로 하나만 받으며, 해당 타입이 기본 타입인지 아닌지를 판별합니다.

반환 값

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

  • 주어진 타입이 기본 데이터 타입이면 → true
  • 주어진 타입이 기본 데이터 타입이 아니면 → false

예제로 이해하기

Input: class final_abc;
    is_fundamental<final_abc>::value;
Output: False

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

Input: is_fundamental<int*>::value;
Output: False

클래스 타입과 포인터 타입은 false를 반환하고, int 같은 내장 타입만 true를 반환하는 것을 확인할 수 있습니다.

실전 예제 1: 클래스와 char 타입 검사

#include <iostream>
#include <type_traits>
using namespace std;
class TP {
    // TP 본문
};
int main() {
    cout << boolalpha;
    cout << "checking for is_fundamental:";
    cout << "\nTP: "<< is_fundamental<TP>::value;
    cout << "\nchar :"<< is_fundamental<char>::value;
    cout << "\nchar& :"<< is_fundamental<char&>::value;
    cout << "\nchar* :"<< is_fundamental<char*>::value;
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

checking for is_fundamental:
TP: false
char : true
char& : false
char* : false

사용자 정의 클래스 TP는 물론, 기본 타입인 char라도 참조자(char&)나 포인터(char*) 형태가 되면 더 이상 기본 타입으로 간주되지 않아 false가 출력됩니다.

실전 예제 2: int와 double 타입 검사

#include <iostream>
#include <type_traits>
using namespace std;
int main() {
    cout << boolalpha;
    cout << "checking for is_fundamental:";
    cout << "\nint: "<< is_fundamental<int>::value;
    cout << "\ndouble :"<< is_fundamental<double>::value;
    cout << "\nint& :"<< is_fundamental<int&>::value;
    cout << "\nint* :"<< is_fundamental<int*>::value;
    cout << "\ndouble& :"<< is_fundamental<double&>::value;
    cout << "\ndouble* :"<< is_fundamental<double*>::value;
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

checking for is_fundamental:
int: true
double : true
int& : false
int* : false
double& : false
double* : false

추가 팁: C++17 축약 문법

C++17부터는 ::value를 생략할 수 있는 변수 템플릿(variable template) 축약 문법을 사용할 수 있습니다.

// C++17 이상
std::cout << std::is_fundamental_v<int>; // true 출력

코드가 더 간결해지므로 최신 C++ 프로젝트에서는 _v 접미사 형태를 사용하는 것이 좋습니다.

정리

std::is_fundamental은 타입 특성(type traits) 유틸리티 중 하나로, 템플릿 메타프로그래밍에서 특정 타입이 내장 기본 타입인지 판별할 때 유용하게 활용됩니다. 참조자와 포인터는 기본 타입으로 취급되지 않는다는 점, 그리고 결과는 항상 컴파일 타임에 결정된다는 점을 기억해 두시기 바랍니다.