结构体模板特化的枚举:修改父类枚举项还是新增并隐藏?
问题解答
先看你给出的基础模板代码:
template <class CPPSTRUCT> struct TStructOpsTypeTraitsBase2 { enum { WithZeroConstructor = false, WithNoInitConstructor = false, WithNoDestructor = false, WithCopy = true, WithSerializer = false, }; }; template<class CPPSTRUCT> struct TStructOpsTypeTraits : public TStructOpsTypeTraitsBase2<CPPSTRUCT> { };
以及特化代码:
template<> struct TStructOpsTypeTraits< FGameplayEffectContext > : public TStructOpsTypeTraitsBase2< FGameplayEffectContext > { enum { WithNetSerializer = true, WithCopy = true }; };
针对你的问题,结论是:这个特化结构体同时做了两件事——新增父类没有的枚举项,并且隐藏父类的同名枚举项(而非修改父类本身的枚举值)
具体拆解:
- 新增枚举项:
WithNetSerializer是父类TStructOpsTypeTraitsBase2里完全没有的成员,属于特化类新增的特性标记。 - 隐藏同名枚举项:C++中,子类(这里特化结构体继承自父类)定义的同名枚举成员会直接隐藏父类的对应成员。比如
WithCopy,即便特化类里的值和父类相同,当你通过TStructOpsTypeTraits<FGameplayEffectContext>::WithCopy访问时,拿到的也是特化类里的定义;如果特化类里把值改成false,父类的WithCopy会被彻底隐藏,但父类自身的枚举值并没有被修改。
补充:这种写法是Unreal Engine里用于标记结构体特性的常规手段,通过特化TStructOpsTypeTraits来为特定结构体定制序列化、复制等行为的开关。
内容的提问来源于stack exchange,提问作者Rango
相关产品推荐
相关产品推荐

