中文注释:UrealEngine-5.2.1源码-AbilitySystemComponent.h
学习内容:
cpp
/** 查找现有的属性集。如果不存在则断言。 */
template <class T >
const T* GetSetChecked() const
{
return (T*)GetAttributeSubobjectChecked(T::StaticClass());
}
这段代码是一个模板方法,用于安全地获取特定类型的属性集。让我来分析一下它的设计和用途:
代码分析
功能说明:
-
类型安全获取 :通过模板参数
T指定要获取的属性集类型 -
编译时检查 :依赖
T::StaticClass()确保类型有效性 -
安全检查 :
Checked后缀表明如果对象不存在会触发断言(assert) -
常量保证 :返回
const T*防止意外修改
设计特点:
-
模板化 :支持任何具有
StaticClass()静态方法的类型 -
类型转换 :使用 C 风格强制转换
(T*) -
常量正确性 :方法标记为
const,返回常量指针
典型使用场景
cpp
// 假设有属性集类型
class FPhysicsAttributes : public FAttributeSet
{
public:
static UClass* StaticClass() { return FPhysicsAttributes::StaticClass(); }
float Mass;
float Friction;
};
// 使用示例
const FPhysicsAttributes* PhysicsAttrs = GetSetChecked<FPhysicsAttributes>();
if (PhysicsAttrs)
{
float mass = PhysicsAttrs->Mass;
// 安全使用物理属性...
}
可能的改进建议
cpp
// 1. 使用更安全的类型转换
template <class T>
const T* GetSetChecked() const
{
return static_cast<const T*>(GetAttributeSubobjectChecked(T::StaticClass()));
}
// 2. 添加调试信息
template <class T>
const T* GetSetChecked() const
{
const void* Result = GetAttributeSubobjectChecked(T::StaticClass());
checkf(Result, TEXT("Failed to get attribute set of type: %s"), T::StaticClass()->GetName());
return static_cast<const T*>(Result);
}
这个方法体现了游戏开发中常见的"获取或断言"模式,确保在开发阶段及时发现问题。