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

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

本文关键字:C++ 类型 代码 是什么 方法 最简单      更新时间:2023-10-16

在虚幻引擎中,我用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行,但我不想每次需要调整这些结构模板时都要更改几十个定义,更不用说在需要新类型时创建额外的副本了。

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

如果有人无意中发现这篇文章,我发现最好的解决方案是使用Visual Studio的T4文本模板引擎,尽管它没有包含在C++项目文件中。在UE4的情况下,可以使用UProject文件来预构建文本模板。

重要资源:

C中的T4++UE4预构建

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