컴파일 타임에 Dynamic Cast 가능 여부 체크
Unreal engine 4 source code를 보다가 재미있는 방법이 있어서 소개드립니다.
컴파일 타임에 A객체와 B객체가 부모, 자식 관계로 캐스팅이 가능/불가능한지 컴파일 타임시에 체크하는 방법입니다.
template<typename From, typename To>
struct TPointerIsConvertableFromTo
{
prviate:
static uint8 Test(...);
static uint16 Test(To*);
public:
enum { Value = sizeof(Test((From*)nullptr)) - 1);
}
위 코드를 분석해보면
만약 From과 To가 부모/자식 관계라면
enum { Value = sizeof(Test((From*)nullptr)) - 1);
이 코드에서 static uint16 Test(To*) 이 함수의 sizeof 연산 결과 enum Value의 값이 1이 됩니다. (2-1)
template<typename From, typename To>
struct TPointerIsConvertableFromTo
{
prviate:
static uint8 Test(...);
static uint16 Test(To*);
public:
enum { Value = sizeof(Test((From*)nullptr)) - 1); //이 코드에서 static uint16 Test(To*) 이 함수의 반환 값
}
만약 From과 To가 부모 자식 관계가 아니라면 static uint8 Test(...)의 sizeof를 계산해 1-1 = 0 이 되어
enum Value의 값이 false가 됩니다.
이를 이용해서 코드에 다음과 같이 사용 할 수 있습니다.
static_assert(TPointerIsConvertibleFromTo<T, const UActorComponent>::Value, "'T' template parameter to FindComponentByClass must be derived from UActorComponent");
참 재미있고 기발한 방법인것 같습니다. :)
'프로그래밍 > UnrealEngine4' 카테고리의 다른 글
Unreal Engine 4 Network Features (0) | 2018.06.02 |
---|---|
UE 4.19 Contributors (0) | 2018.06.02 |
HTC Vive VR Preview 화면 (0) | 2017.02.07 |
Unreal engine 4 SetActive (0) | 2017.01.31 |
Unreal engine 4 intellisense 속도 (0) | 2017.01.18 |