이 글에서는 C++ STL의 std::is_class 템플릿이 어떻게 동작하는지, 그리고 문법과 실제 사용 예제를 통해 자세히 살펴보겠습니다.
is_class 템플릿은 주어진 타입이 클래스(class) 타입인지 아니면 다른 타입인지를 컴파일 시점에 검사하는 데 사용되는 타입 특성(type trait)입니다.
클래스란 무엇인가?
클래스는 데이터 멤버와 멤버 함수를 포함할 수 있는 사용자 정의 데이터 타입 또는 데이터 구조로, class 키워드를 사용하여 선언합니다.
클래스 선언 예시
class abc {
int data_members;
void member_function();
};즉, is_class 템플릿은 타입 T가 클래스인지 확인하고, 그 결과를 불리언 값(true 또는 false)으로 반환합니다.
문법(Syntax)
template <class T> is_class;
매개변수(Parameters)
이 템플릿은 타입 T 하나의 매개변수만 가질 수 있으며, 해당 타입이 클래스인지 아닌지를 검사합니다.
반환값(Return Value)
- true: 주어진 타입이 클래스인 경우
- false: 주어진 타입이 클래스가 아닌 경우
동작 원리 이해하기
Input: class abc {
};
is_class<abc>::value;
Output: true
Input: union abc {
};
is_class<abc>::value;
Output: false위 예시에서 볼 수 있듯이, union으로 선언된 타입은 클래스가 아니므로 false가 반환됩니다.
예제 1: 클래스와 유니언 비교
#include <iostream>
#include <type_traits>
using namespace std;
class TP_1 {
};
union TP_2 {
int var_1;
float var_2;
};
int main() {
cout << boolalpha;
cout << "checking for is_class template: ";
cout << "\nTP_1 class : " << is_class<TP_1>::value;
cout << "\nTP_2 union : " << is_class<TP_2>::value;
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
checking for is_class template: TP_1 class : true TP_2 union : false
예제 2: 클래스, 유니언, 구조체 비교
#include <iostream>
#include <type_traits>
using namespace std;
class TP_1 {
int var_1;
float var_2;
char var_3;
};
union TP_2 {
int var_1;
float var_2;
char var_3;
};
struct TP_3 {
int var_1;
float var_2;
char var_3;
};
int main() {
cout << boolalpha;
cout << "checking for is_class template: ";
cout << "\nTP_1 class : " << is_class<TP_1>::value;
cout << "\nTP_2 union : " << is_class<TP_2>::value;
cout << "\nTP_3 structure : " << is_class<TP_3>::value;
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
checking for is_class template: TP_1 class : true TP_2 union : false TP_3 structure : true
정리
C++에서 struct로 선언한 구조체도 내부적으로는 클래스로 취급되기 때문에 is_class의 결과가 true로 나타납니다. 반면 union은 클래스가 아닌 별도의 타입 분류에 속하므로 false가 반환됩니다. 이처럼 std::is_class는 템플릿 메타프로그래밍이나 조건부 컴파일 로직을 작성할 때 타입을 정확히 판별하는 데 유용하게 활용할 수 있습니다.