(UE4)在标头中保存lambda函数

(UE4) Save a lambda function in the header

本文关键字:保存 lambda 函数 UE4      更新时间:2023-10-16

我目前正在定义一个lamda函数,我想将其保存在头文件中。

void FURealisticGraspingEditorModule::OnPreviewCreation(const TSharedRef<IPersonaPreviewScene>& InPreviewScene)
{
TSharedRef<IPersonaToolkit> PersonaToolKitRef = InPreviewScene.Get().GetPersonaToolkit();
auto lambda = [PersonaToolKitRef]() { return PersonaToolKitRef.Get(); };
DebugMeshComponent = PersonaToolKitRef.Get().GetPreviewMeshComponent();
}

lamda变量应保存在标头中。我还没能做到这一点,现在我很好奇这是否可能。我尝试了auto和TFunctionRef。也许你们可以给我一个提示,让我实现这个,甚至用另一种方法将这个调用保存在变量中。

为了在初始化lambda变量时单独声明它,您需要将其存储在std::function中。lambda的类型只有在创建时才是已知的,因此不可能声明一个变量来单独存储它。

例如:

auto a = []{ return 1; }; // OK
auto b; // invalid, can't declare as auto as the type can't be deduced
b = []{ return 1; };
std::function< bool() > c;
c = []{ return 1; }; // OK, we can store a lambda in std::function

如果为C++17编译并声明它为inline,则可以在头文件中定义(并初始化(lambda。

至少,我认为它适用于lambdas,试试看。

Lambdas可以存储在函数指针中,而不需要太多的精力,比如:

在页眉中:double (*lambda)(double);

在.cpp文件中:lambda = [&](double a) { return 2*a; };

这种方法的问题在于,定义的lambda类型不能是动态的。我的意思是,分配的lambda需要与标头中定义的类型匹配,因此它必须具有相同的返回类型,并且在类型方面,必须具有完全相同的参数列表。

还有一件小事。在C++中,不允许在同一范围内重新声明函数和变量。如果您直接在头文件中定义一个变量,并且碰巧将其包含在多个源文件中,您将以疯狂错误的形式得到令人不快的惊喜。在头文件中,使用extern定义变量,然后在一个源文件中正常定义,以避免出现问题。