(UE4) 在 header 中保存一个 lambda 函数

(UE4) Save a lambda function in the header

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

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

lamda 变量应该保存在 header 中。我还没有设法做到这一点,现在我很好奇这是否可能。我尝试了自动和 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 编译并声明它,您可以在头文件中定义(并初始化)lambda inline

至少,我认为它适用于 lambda,试试吧。

Lambda 可以存储在函数指针中,而不需要像那样费力:

在header中: double (*lambda)(double);

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

这种方法的问题在于定义的 lambda 类型不能是动态的。我的意思是分配的 lambda 需要匹配 header 中定义的类型,因此它必须具有相同的 return 类型和 type-wise 完全相同的参数列表。

还有一件小事。在 C++ 中,不允许 re-declare 在同一范围内既不是函数也不是变量。如果您直接在 header 文件中定义一个变量,并且碰巧将它包含到多个源文件中,您将以疯狂错误的形式得到令人不快的惊喜。在 header 文件中,使用 extern 定义您的变量,然后在一个源文件中正常定义它以避免麻烦。