c++ - 如何安全地向下转换 USTRUCT

标签 c++ reflection polymorphism unreal-engine4

虚幻引擎支持向下转换 UObject* 通过 Cast<T> 并通过 custom implementation of dynamic_cast<T*> .

下垂时 USTRUCT 对象,这两种方法都不起作用:

  1. Cast<T>的方法不支持转换为 UScriptStructs .
  2. UE4 在没有 RTTI 的情况下编译(例如 /GR- 是为 cl.exe 设置的)并且 UE4 使用 dynamic_cast<T*>指向 USTRUCT 的指针的实现秒。因此编译器抛出 C4541 (见下面的例子)。

UE4.22有没有安全downcast的方法USTRUCT是否正在使用 UE4 的反射系统(所以当 static_cast<T*> 等不是一个选项时)?

如果不是,那为什么 UE4 不支持向下转型 USTRUCT是通过它的 Cast 函数吗?例如。不应该引用它们还是与 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
}

最佳答案

Is there a method in UE4.22 to safely downcast USTRUCTs using the reflection system of UE4 (so when static_cast<T*> etc is not an option)?

我知道这不是一个理想的解决方案,可能不适合你的情况,但如果你不想使用裸 static_cast,你可以提供一个模板化函数来执行转换并添加一个包含 TIsDerivedFromstatic_assert 在转换失败时获取编译时错误。

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);
}

why UE4 doesn't support downcasting USTRUCTs by its Cast functions?

那是因为结构在虚幻引擎中被认为是轻量级实体,因此反射——Cast 工作所必需的——未提供以最小形式提供他们。

使用指向 USTRUCTs 的指针时要小心,因为它们不仅不受反射支持,而且不受垃圾收集器、序列化器、UI 等的支持。在处理它们时你必须知道你在做什么.

关于c++ - 如何安全地向下转换 USTRUCT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090903/

相关文章:

android - 从 Android L 及更高版本开始,setMobileDataEnabled 方法不再可调用

C++ 覆盖函数

java - 如何避免使用通配符对继承的递归类进行强制转换?

C++重用对象以使用抽象基类实现多态性

c++ - 是否可以为 std::array 定义隐式转换运算符?

c++ - 存储和重新使用 decltype 值?

c++ - 如何在编译时断言函数是特定类的成员

android - 在单个 APK 中定位多个 API

c++ - 如何在 C++ 中实现生成器?

c# - 如何获取缺少的程序集中包含的类型名称