Unreal : Type Traits
알아두면 좋을 Unreal c++ Template Type Traits
1. TEnableIf
- template의 Trait이 Enable한지 체크하는데 사용한다.
예시
// T가 UObject가 같은 타입인지 체크한다.
template<typename T, TEnableIf<TIsSame<T, UObject>::Value>::Type>
2. TAnd, TOr, TNot
- template type Trait의 조건을 TEnableIf를 사용하여 여러 조건을 설정하는데 사용한다.
//TAnd
template<typename T, TEnableIf
<
TAnd
<
TIsSame<T, UObject>,
TIsSame<T, UUserWidget>
>::Value
>::Type
// TOr
template<typename T, TEnableIf
<
TOr
<
TIsSame<T, UObject>,
TIsSame<T, UUserWidget>
>::Value
>::Type
// TNot
template<typename T, TEnableIf
<
TNot<TIsSame<T, UObject>>::Value
>::Type
3. TIsDerivedFrom
template<typename DerivedType, typename BaseType>
에서 DerivedType이 BaseType을 상속받는지 체크한다.
예시
//case 1 : with static_assert
template<typename T>
void Func(T* InObject)
{
static_asset(TIsDerivedFrom<T, UObject>::IsDerived, "comment");
}
//case 2 : with template
template<typename T, typename = typename TEnableIf<TIsDerivedFrom<T, UObject>::IsDerivedType>::Type>
void Func(T* InObject)
{}
4. TIsSame
template<typename A, typename B>
에서 A와 B가 같은 타입인지 체크한다.
예시
template<typename T, typename = typename TEnableIf<TIsSame<T, UObject>::Value>::Type>
void Func(T* InObject)
{}
5. TPointerIsConvertibleFromTo
template<typename From, typename To>
에서 From 포인터를 To 포인터로 변환할 수 있는지 체크한다.
예시
template<typename T, typename = typename TEnableIf<TPointerIsConvertibleFromTo<T, UObject>::Value>::Type>
void Func(T* InObject)
{}
이외에도 많은 Trait이 존재한다.
TIsEnum, TIsArray, TIsPointer, TIsFunction…
template선언시 작성하지 않고 코드내에서 if문과 같은 조건식으로도 활용할 수 있다.
예시
template<typename T>
void Func(T* InParam)
{
if(TIsDerivedFrom<T, AActor>::IsDerivedType)
{
// T is Actor!
}
}