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

当向下转换 USTRUCT 对象时,这两种方法都不起作用:

  • Cast<T>方法不支持到UScriptStructs的转换。
  • UE4无需RTTI即可编译(例如,为cl.exe设置 /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_assertTIsDerivedFrom以获得编译时错误是失败的 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/

    10-11 18:29