"lambda capture"正常功能?

"lambda capture" on regular function?

本文关键字:功能 常功能 lambda capture      更新时间:2023-10-16
void startDrawLoop(function<bool()> func)
{
while (func()) {} 
}
int main() 
{
CubeRenderer cubeRenderer; TextRenderer textRenderer;
// Do initialization
auto drawLoop=[&] () 
{
cubeRenderer.draw();
textRenderer.draw();
return true;
} 
startDrawLoop(drawLoop);
return 0;
} 

如果我drawLoop更改为函数。

bool drawLoop()
{
// Error, cannot find cubeRenderer
cubeRenderer.draw();
textRenderer.draw();
return true;
} 

如何像 lambda 捕获那样引用函数外部的变量?

您可以让drawLoop接受参数并从执行捕获的 lambda 调用它。

void startDrawLoop(function<bool()> func)
{
while (func()) {}
}
bool drawLoop(CubeRenderer const& cubeRenderer, TextRenderer const& textRenderer)
{
cubeRenderer.draw();
textRenderer.draw();
return true;
}
int main()
{
CubeRenderer cubeRenderer; TextRenderer textRenderer;
startDrawLoop([&]() { drawLoop(cubeRenderer, textRenderer); });
}

你也可以使用std::bind但我个人觉得它与lambda相比很丑。

startDrawLoop(std::bind(drawLoop, std::cref(cubeRenderer), std::cref(textRenderer));

如果要使调用站点尽可能简单,可以将startDrawLoop创建为模板,以接受具有任何参数的任何函数。

template<typename F, typename... Args>
void startDrawLoop(F func, Args const&... args)
// [...]
startDrawLoop(drawLoop, cubeRenderer, textRenderer);

演示

没有lambda的等效代码是:

struct lambda_t
{
CubeRenderer &cubeRenderer;
TextRenderer &textRenderer;
bool operator()() const
{ 
cubeRenderer.draw();
textRenderer.draw();
return true;
}
};

int main() 
{
CubeRenderer cubeRenderer; TextRenderer textRenderer;
lambda_t drawLoop{cubeRenderer, textRenderer};
startDrawLoop(drawLoop);
return 0;
} 

这是否更美观取决于你......