본문 바로가기

게임프로그래밍/언리얼엔진

[언리얼엔진5] 컴파일 단계에서 원하는 템플릿 함수 타입이 맞는지 확인하기

1. 서론

 

탬플릿 함수를 사용할 때 typename을 T로 설정할때 T에 모든 타입이 올 수 있지만 특정 타입으로 제한하고 싶은 경우가 있다. 오버로드를 사용하여 원하는 타입만 지정하는 방법도 있지만 이렇게 하지 않고 컴파일 단계에서 원하는 타입이 맞는지 확인해보자.

 

2. 코드 예제

 

template<class T>
T* GetOwningPawn() const
{
    static_assert(TPointerIsConvertibleFromTo<T, APawn>::Value, "'T' Template Parameter get GetPawn must be derived from APawn");
    return CastChecked<T>(GetOwner());
}

 

Pawn을 리턴하는 탬플릿함수이다. 이때 Pawn은 꼭 APanw이 아니라 Character 등 APawn에서 유래하는 클래스들만 반환을 하고 싶다.

 

3. 구문 설명

 

static_assert: 해당 함수는 C++ 11부터 지원하는 문법으로 조건식을 확인하여 false가 나오면 컴파일 에러를 발생시킨다.

 

TPointerIsConvertibleFromTo<T*, U*>::Value: TPointerIsConvertibleFromTo는 언리얼 엔진에서 제공해주는 문법으로 T*가 U*로 변환될 수 있는지 확인하는 문법이다. Value는 boolean 값으로 컴파일 단계에서 확인 가능한 상수이다.

 

이 문법을 사용하면 템플릿 함수를 사용할때 런타임에서 에러가 발생하는 것을 상당부분 예방할 수 있을 것이다.