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

C++ std::is_trivial 함수 완벽 가이드: 트리비얼 클래스 판별 방법

이 글에서는 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입니다.