게임 개발/Unreal Engine

[UE4] TSet의 KeyFuncs 사용하여 구조체 키를 사용는 방법

지노윈 2022. 2. 21. 23:59
반응형

TSet의 KeyFuncs 사용하여 구조체 키를 사용는 방법을 알아 보겠습니다.

TSet의 Syntax이며 두 번째 파라미터가 KeyFuncs입니다.

template<typename InElementType, typename KeyFuncs, typename Allocator>
class TSet

 

먼저 간단한 구조체를 정의합니다.

USTRUCT()
struct FMyStruct
{
	GENERATED_BODY()

	FMyStruct() : Name(""), SomeFloat(0.f) {}
	FMyStruct(FString name, float someFloat) : Name(name), SomeFloat(someFloat) {}

	UPROPERTY()
	FString Name;
	UPROPERTY()
	float SomeFloat;
};

BaseKeyFuncs를 부모로하는 FMyStuct를 위한 KeyFuncs를 구현합니다.

struct TMyStructSetKeyFuncs : BaseKeyFuncs<FMyStruct, FString>
{
private:
	typedef BaseKeyFuncs<FMyStruct, FString> Super;

public:
	typedef typename Super::ElementInitType ElementInitType;
	typedef typename Super::KeyInitType     KeyInitType;

	static KeyInitType GetSetKey(ElementInitType Element)
	{
		return Element.Name;
	}

	static bool Matches(KeyInitType A, KeyInitType B)
	{
		return A.Compare(B, ESearchCase::CaseSensitive) == 0;
	}

	static uint32 GetKeyHash(KeyInitType Key)
	{
		return FCrc::StrCrc32(*Key);
	}
};

 

이제 이를 사용하는 코드입니다.

	TSet<FMyStruct, TMyStructSetKeyFuncs> setData
	{
		{FMyStruct("dev", 22.3f)},
		{FMyStruct("jino", 11.2f)},
		{FMyStruct("hello", 100.0f)}
	};

	FString key = "jino";
	FMyStruct* found = setData.Find(key);
	UE_LOG(LogTemp, Warning, TEXT("key:%s somefloat:%.1f"), *found->Name, found->SomeFloat);

출력 결과는 다음과 같습니다.

LogTemp: Warning: key:jino somefloat:11.2

 

이 구현의 특이점은 FMyStruct 값이 아니라 FString 값을 사용하여 TSet.Find를 수행 했다는 것입니다.

 

연관되어 함께 다음의 글들도 살펴보면 도움이 됩니다.

[게임 개발/Unreal Engine] - [UE4] TMap의 KeyFuncs 사용하여 구조체 키를 사용는 방법

[게임 개발/Unreal Engine] - [UE4] TMap, TSet의 Key 값으로서 구조체를 사용 방법