이 글에서는 C++ STL의 std::is_trivial 템플릿의 동작 원리, 문법, 그리고 실제 예제를 자세히 살펴보겠습니다.
is_trivial은 <type_traits> 헤더 파일에 포함된 템플릿으로, 주어진 타입 T가 트리비얼(trivial) 클래스인지 여부를 컴파일 시점에 확인하는 데 사용됩니다.
C++에서 트리비얼 클래스 타입이란?
데이터가 메모리에 연속적으로 저장되고 오직 정적 기본 초기화(static default initialization)만 허용하는 타입을 트리비얼 타입이라고 합니다. 트리비얼 타입에는 모든 타입의 배열, 클래스, 스칼라 타입(int, char, float 등)이 포함될 수 있습니다.
트리비얼 클래스는 기본 생성이 트리비얼하고(trivially default constructible), 복사와 이동이 트리비얼한(trivially copyable) 클래스를 의미합니다. 클래스를 트리비얼하게 만들려면 다음 조건들을 충족해야 합니다.
- 가상 멤버 함수나 가상 기반 클래스(virtual base class)가 없어야 합니다.
- 사용자가 직접 정의한 비정적(non-static) 멤버가 없어야 합니다.
- 비정적 멤버를 가진 기반 클래스로부터 상속받지 않아야 합니다.
문법
template <class T> is_trivial;
매개변수
템플릿은 검사할 대상인 T 타입 매개변수 하나만 받으며, 해당 타입이 트리비얼 클래스 타입인지 여부를 확인합니다.
반환 값
불리언(Boolean) 값을 반환합니다. 주어진 타입이 트리비얼 클래스 타입이면 true를, 그렇지 않으면 false를 반환합니다.
예제
Input: class A {};
class B { B() {} };
class D { virtual void fn() {} };
cout<<"A: "<<is_trivial<A>;
cout<<"B: "<<is_trivial<B>;
cout<<"D: "<<is_trivial<D>;
Output:
A: True
B: False
D: False
실전 예제 코드
#include <iostream>
#include <type_traits>
using namespace std;
class TP_1 {
};
class TP_2 {
TP_2(){
}
};
class TP_3 : TP_2 {
};
class TP_4 {
virtual void dummy() {
}
};
int main() {
std::cout << std::boolalpha; // 불리언 형태로 값 출력
std::cout << "TP_1: " << std::is_trivial<TP_1>::value << endl;
std::cout << "TP_2: " << std::is_trivial<TP_2>::value << endl;
std::cout << "TP_3: " << std::is_trivial<TP_3>::value << endl;
std::cout << "TP_4: " << std::is_trivial<TP_4>::value << endl;
return 0;
}
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
TP_1: true
TP_2: false
TP_3: false
TP_4: false
결과 분석
- TP_1: 아무 멤버도 없는 빈 클래스이므로 기본 생성과 복사가 모두 트리비얼하여
true입니다. - TP_2: 사용자가 직접 정의한 생성자가 있어 기본 생성이 트리비얼하지 않으므로
false입니다. - TP_3: 트리비얼하지 않은 TP_2를 상속받았기 때문에
false입니다. - TP_4: 가상 함수(virtual function)를 포함하고 있어 가상 테이블이 생성되므로
false입니다.