调整捕获的lambda值

时间:2015-03-02 08:38:55

标签: c++ lambda c++14

我有以下情况:

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的优越性的讨论,但显然它们并非用于所有目的。

1 个答案:

答案 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);});
}