c++ - 当模板和宏不可用时,生成类型变体 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++?自动生成我需要的代码的最佳方法是什么?
解决方案
万一有人偶然发现这篇文章,我发现的最佳解决方案是使用 Visual Studio 的 T4 文本模板引擎,尽管它没有包含在 C++ 项目文件中。对于 UE4,您可以使用 UProject 文件来预构建文本模板。
重要资源:
我的 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"
]
}
推荐阅读
- java - Android:从不同的布局到达按钮对象
- javascript - 画布触控支持,定位触控事件
- python - 熊猫找到价格变化一定量所需的最短时间
- jenkins - 为什么我的 Jenkins 管道失败并显示错误代码 24
- mysql - MySQL:使用来自另一个表列的随机值触发更新
- reactjs - how to use spyOn on a class less component
- java - 使用 Intent 从 WebView 拨打电话不起作用
- c++ - std::unordered_map find() 操作在 GCC7 中不起作用
- python - 选择具有 notna 属性的多个 comumns
- python - Python并发第一个结果结束等待尚未完成的结果