当无法使用模板和宏时,生成类型变体 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"
]
}
在 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"
]
}