我有以下情况:
int p;
[p]() {
// really complex and really long code executing outside the main thread
}
lambda对象应该在我的代码中的几个地方实例化,每次都会捕获p
。问题是,lambda的代码相当长并且取决于p
,我不想在任何地方复制和粘贴相同的代码。我不愿意通过引用捕获,因为lambda正在线程的上下文中执行,并且引用的对象可能会更改。什么是最好的事情?可以通过某种方式通过引用帮助捕获thread_local
变量吗?
编辑:
最后我这样做了:
::std::function<void(int)> f; // captures the lambda
int p;
run_in_thread(::std::bind(f, p));
之前我没有想到这一点的原因是关于lambdas over ::std::bind
的优越性的讨论,但显然它们并非用于所有目的。
答案 0 :(得分:4)
如果你想要干净的代码,你通常应该避免使用大型的lambda。因此,最干净的解决方案可能是将代码移动到lambda反过来调用的新函数中。
void complexFunction(int p) {
// really complex and really long code executing outside the main thread
}
void run() {
for(int i = 0; i < 10; ++i)
runThread([i]() {complexFunction(i);});
}