首页 > 解决方案 > 当模板和宏不可用时,生成类型变体 C++ 代码的最简单方法是什么?

问题描述

在虚幻引擎中,我用 C++ 创建了一系列结构,让我可以生成 TMap 结构的复制版本。它依赖于许多引擎资源,例如快速数组序列化,并且结构需要像普通的 USTRUCT 一样被引擎识别。

例如,这里是其中一个结构的起始部分:

USTRUCT(BlueprintType)
struct FReplicatedTMap_GuidToGuid_Array : public FFastArraySerializer
{
    GENERATED_BODY()

public:
    UPROPERTY(BlueprintReadOnly, NotReplicated, VisibleAnywhere)
        TMap<FGuid, FGuid> ReplicatedMap;

长话短说,我的实施有效。但是,由于 UHT(Unreal Header Tool)的限制,我不能使用模板

USTRUCT(BlueprintType)
template<>

因为引擎不支持它,我不能使用宏

#define \
USTRUCT(BlueprintType) \

因为 UHT 预处理器在查找自己的宏(如 USTRUCT())之前不会扩展宏,这会阻止引擎评估预处理器生成的代码。

在第一个代码示例中,您可以看到每组结构/函数定义仅适用于一个键类型 - 值类型对。代码本身只有大约 150 行左右,但我不想在每次需要调整这些结构模板时都更改多个定义,更不用说在需要新类型时创建额外的副本了。

虚幻中是否有解决方案,或者使用 C++?自动生成我需要的代码的最佳方法是什么?

标签: c++templatesmacrosunreal-engine4auto-generate

解决方案


万一有人偶然发现这篇文章,我发现的最佳解决方案是使用 Visual Studio 的 T4 文本模板引擎,尽管它没有包含在 C++ 项目文件中。对于 UE4,您可以使用 UProject 文件来预构建文本模板。

重要资源:

C++ UE4 PreBuild中的 T4

我的 UProject 代码添加到使用 VS2019 运行 T4 引擎:

"PreBuildSteps":
{
    "Win64": [
        "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE\\TextTransform.exe\"
        $(ProjectDir)\\Source\\<YOUR_FILE_LOCATION>\\<YOUR_TEMPLATE_FILE>.tt","echo T4 Executions Complete"
    ]
}

推荐阅读