调整捕获的 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);});
}
我有以下情况:
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);});
}