虚幻引擎支持通过 UObject*
和 Cast<T>
向下转换custom implementation of dynamic_cast<T*>
。
当向下转换 USTRUCT
对象时,这两种方法都不起作用:
Cast<T>
方法不支持到UScriptStructs
的转换。 /GR-
),UE4使用实现的dynamic_cast<T*>
指向USTRUCT
s的指针。因此,编译器将抛出C4541(请参见下面的示例)。 UE4.22中是否存在使用UE4的反射系统安全地将
USTRUCT
降频的方法(因此,当static_cast<T*>
等不可行时)?如果不是,那么为什么UE4不通过其Cast函数支持向下转换
USTRUCT
?例如。不应引用它们,还是与Blueprint相关的原因?(2)的示例,在UE4项目中使用:
#pragma once
#include "CoreMinimal.h"
USTRUCT()
struct MyStructBase
{
virtual ~MyStructBase() = default;
};
USTRUCT()
struct MyStructDerived : public MyStructBase
{};
void TestFunc()
{
auto lvalue = MyStructBase{};
auto lvaluePtr = &lvalue;
auto o = dynamic_cast<MyStructDerived*>(lvaluePtr); // cl.exe throws C4541
}
最佳答案
我知道这不是理想的解决方案,可能不适合您的情况,但是如果您不想使用裸static_cast
,则可以提供一个模板函数来进行强制转换,并在其中添加带有static_assert
的TIsDerivedFrom
以获得编译时错误是失败的 Actor 。
template<typename T, typename U>
T* CastStruct(U* base)
{
static_assert(TIsDerivedFrom<T, U>::IsDerived, "Type T has to be derived from U.");
return static_cast<T*>(base);
}
那是因为在虚幻引擎中结构应该是轻量级的实体,因此没有为反射提供
Cast
所需的反射。使用指向
USTRUCTs
的指针时要小心,因为它们不仅不受反射的支持,而且还不受垃圾收集器,序列化器,UI等的支持。您必须知道在处理它们时在做什么。关于c++ - 如何安全地向下转换USTRUCT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56090903/