前言

开发场景中,遇到了使用TMap时,将键值类型修改到项目中自定义的数据类型。如果不进行额外编码,编译过程会出现错误。虚幻引擎对于想要做为TMap键值的数据类型有额外的要求,必须满足实现hash序列,和常规的比较运算符重载。下面的代码,简单的为大家展示了如何完成TMap键值类型的自定义。

操作

1、声明结构体类型(头文件中),注意实现比较重载运算(这是必须的)。

c++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
//声明在头文件中
struct FMapKey
{
public:
    int32 KeyID;
 
    bool operator ==(const FMapKey& Other) const
    {
        return KeyID == Other.KeyID;
    }
};

其中的KeyID,是用来测试的,主要是用来比较两个MapKey是否相同(是一种比较规则的数据依据)

2、构建Hash全局函数,用来讲FMapKey进行Hash转换

c++
1
2
3
4
5
//声明在全局域中,我声明定义在了头文件中
inline uint32 GetTypeHash(const FMapKey& Explain)
{
    return Explain.KeyID;//未真正进行Hash运算,只是将KeyID作为Hash值
}

此函数主要目的是为了将键值转换为Hash值,算法部分由设计者提供并维护,引擎端只需要一个uint32的值即可。Hash算法应保证不同的键值结果不同,相同的键值,结果相同。

结语

可以被用作TMap键值类型的有:基础数据类型,指针,虚幻个别自定义类型。所以拓展键值类型,添加自己的类型作为键值类型,是非常有必要的。

引擎版本:4.27.2