调整捕获的 lambda 值

tweaking captured lambda values

我有以下情况:

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

如果你想要干净的代码,你通常应该避免使用大体的 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);});
}