이 글에서는 C++ STL에서 제공하는 std::is_pod 템플릿의 동작 원리, 문법, 그리고 실제 활용 예제를 자세히 살펴보겠습니다.
is_pod는 <type_traits> 헤더 파일에 정의된 템플릿으로, 주어진 타입 T가 POD(Plain Old Data) 타입인지 여부를 확인하는 데 사용됩니다.
POD(Plain Old Data)란?
POD 타입이란 예전 C 언어에서도 사용되던 형태의 타입들을 의미합니다. 여기에는 int, float, char 같은 스칼라(scalar) 타입도 포함됩니다.
POD 클래스 타입이 되려면 다음 두 가지 조건을 모두 충족해야 합니다.
- Trivial(트리비얼) : 정적 초기화가 가능한 타입
- Standard Layout(표준 레이아웃) : struct나 union처럼 단순한 데이터 구조를 가진 타입
문법
template <class T> is_pod;
매개변수
이 템플릿은 타입 T 한 개만을 매개변수로 받으며, 전달된 타입이 Plain Old Data 타입인지 검사합니다.
반환 값
불리언(Boolean) 값을 반환합니다. 주어진 타입이 Plain Old Data이면 true, 그렇지 않으면 false를 반환합니다.
기본 예제
입력: class final_abc { final_abc(); };
is_pod<final_abc>::value;
출력: False
입력: is_pod<int>::value;
출력: True예제 1: struct 타입 검사
#include <iostream>
#include <type_traits>
using namespace std;
struct TP_1 {
int var_1;
};
struct TP_2 {
int var_2;
private:
int var_3;
};
struct TP_3 {
virtual void dummy();
};
int main() {
cout << boolalpha;
cout << "checking for is_pod:";
cout << "\nTP_1: " << is_pod<TP_1>::value;
cout << "\nTP_2: " << is_pod<TP_2>::value;
cout << "\nTP_3: " << is_pod<TP_3>::value;
return 0;
}출력 결과
checking for is_pod: TP_1: true TP_2: false TP_3: false
결과 분석 : TP_1은 모든 멤버가 public이므로 POD 조건을 충족합니다. 반면 TP_2는 public과 private 멤버가 섞여 있어 표준 레이아웃 요건을 위반하고, TP_3는 가상 함수(virtual function)를 포함하고 있어 trivial하지 않기 때문에 false가 반환됩니다.
예제 2: class 타입 검사
#include <iostream>
#include <type_traits>
using namespace std;
class TP_1 {
int var_1;
};
class TP_2 {
int var_2;
private:
int var_3;
};
class TP_3 {
virtual void dummy();
};
int main() {
cout << boolalpha;
cout << "checking for is_pod:";
cout << "\nTP_1: " << is_pod<TP_1>::value;
cout << "\nTP_2: " << is_pod<TP_2>::value;
cout << "\nTP_3: " << is_pod<TP_3>::value;
return 0;
}출력 결과
checking for is_pod: TP_1: true TP_2: true TP_3: false
결과 분석 : class는 기본 접근 지정자가 private이므로, TP_2에서 private을 명시적으로 선언해도 모든 멤버의 접근 수준이 동일하게 유지됩니다. 따라서 표준 레이아웃 요건을 충족하여 true가 반환됩니다. TP_3는 여전히 가상 함수 때문에 false입니다.
참고: C++20 이후의 변화
std::is_pod는 C++20부터 공식적으로 지원 중단(deprecated)되었습니다. 최신 C++ 코드에서는 std::is_trivial과 std::is_standard_layout을 각각 조합해 사용하는 것이 권장됩니다.