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

时间:2018-07-11 14:26:30

标签: c++ unreal-engine4

我当前正在定义一个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。也许有人暗示我可以实现这一目标,甚至可以通过另一种方式将调用保存到变量中。

3 个答案:

答案 0 :(得分:0)

要分别声明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

答案 1 :(得分:0)

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

至少,我认为它适用于lambda,请尝试一下。

答案 2 :(得分:0)

Lambda可以轻松地存储在函数指针中,例如:

在标题中: double (*lambda)(double);

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

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

还有另一件事。在C ++中,不允许在同一范围内重新声明函数或变量。如果您直接在头文件中定义一个变量,并且碰巧将其包含到多个源文件中,则您会以疯狂的错误形式感到不愉快。在头文件中,使用extern定义变量,然后通常在一个源文件中定义它,以避免麻烦。