게임 개발/Unreal Engine

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

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

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

TMap의 Syntax이며 마지막 파라미터가 KeyFuncs입니다.

template<typename KeyType, typename ValueType, typename SetAllocator, typename KeyFuncs>
class TMap : public TSortableMapBase< KeyType, ValueType, SetAllocator, KeyFuncs >

 

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

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를 구현합니다.

template <typename ValueType>
struct TMyStructMapKeyFuncs : BaseKeyFuncs<TPair<FMyStruct, ValueType>, FMyStruct>
{
private:
	typedef BaseKeyFuncs<TPair<FMyStruct, ValueType>, FMyStruct> Super;

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

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

	static bool Matches(KeyInitType A, KeyInitType B)
	{
		return A.Name.Equals(B.Name);
	}

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

 

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

	TMap<FMyStruct, uint32, FDefaultSetAllocator, TMyStructMapKeyFuncs<uint32>> mapData
	{
		{FMyStruct("dev", 22.3f), 1},
		{FMyStruct("jino", 11.2f), 2},
		{FMyStruct("hello", 100.0f), 3}
	};

	FMyStruct val("jino", 11.2f);
	uint32* found = mapData.Find(val);
	UE_LOG(LogTemp, Warning, TEXT("found:%d"), *found);

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

LogTemp: Warning: found:2

 

또 다른 방법은, 구조체에 operator==와 구조체 멤버가 아닌 GetTypeHash 오버로드를 하여 구현하는 방법이 있으며 다음의 글을 참고해 주세요.

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