我当前正在定义一个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。也许有人暗示我可以实现这一目标,甚至可以通过另一种方式将调用保存到变量中。
答案 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
定义变量,然后通常在一个源文件中定义它,以避免麻烦。