首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何安全地下行USTRUCT

如何安全地下行USTRUCT
EN

Stack Overflow用户
提问于 2019-05-11 13:43:44
回答 2查看 5.4K关注 0票数 3

不真实的引擎支持通过UObject*通过Castdynamic_cast下传。

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

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

在UE4.22中是否有一种方法可以安全地使用UE4的反射系统(因此,当static_cast<T*>等不是一个选项)?

如果不是,那么为什么UE4不支持通过其强制转换函数来下播USTRUCT?它们不应该被引用吗?或者蓝图的原因是相关的?

例如(2),在UE4项目中使用:

代码语言:javascript
复制
#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
}
EN

回答 2

Stack Overflow用户

发布于 2019-05-11 17:16:59

根据这个帖子在虚幻论坛,没有工作的动态转换为UStruct在虚幻。我不知道为什么,但根据这个UStruct,指向类型为帖子的对象的指针似乎不受虚幻的反射系统的支持。

你在这里的选择包括一个C风格的演员阵容,就像你提到的,一个静态的演员阵容.但是,这两个选项都不是那么安全,只有当您知道要传递给强制转换的对象是强制转换中指定的类型时,静态转换通常是安全的。

C型铸造:

代码语言:javascript
复制
auto o = (MyStructDerived*) lvaluePtr;

静态铸造:

代码语言:javascript
复制
auto o = static_cast<MyStructDerived*>(lvaluePtr);
票数 0
EN

Stack Overflow用户

发布于 2021-11-25 16:21:03

您还可以通过检查结构的类型是否是您要转换的类型的子类型,以及您要转换到的类型是结构类型的子类型来检查转换结构的安全性。如果这两种条件都是正确的,它们是相同的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56090903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档