当无法使用模板和宏时,生成类型变体 C++ 代码的最简单方法是什么?

What's the easiest way to generate type-variant C++ code when templates and macros aren't possible?

在 Unreal Engine 中,我用 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())之前不会扩展宏,这会阻止引擎评估预处理器生成的代码。

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

是否有在 Unreal 中或使用 C++ 的解决方案?自动生成我需要的代码的最佳方式是什么?

万一有人偶然发现这个 post,我发现的最佳解决方案是使用 Visual Studio 的 T4 文本模板引擎,尽管它没有包含在 C++ 项目文件中。如果是UE4,可以使用UProject文件预建一个Text Template。

重要资源:

T4 in C++ UE4 PreBuild

我的 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"
    ]
}