我希望能够在两个lambda函数之间共享包含范围内的变量。我有以下几点:
void holdAdd(const Rect& rectangle, Hold anonymousHeld, Hold anonymousFinish) {
std::map<int,bool> identifierCollection;
HoldFinish holdFinish = [=](const int& identifier) mutable {
if (identifierCollection.count(identifier) == 0) return;
identifierCollection.erase(identifier);
anonymousFinish();
};
holdCollisionCollection.push_back([=](const int& identifier, const Vec2& point) mutable {
if (rectangle.containsPoint(point)) {
identifierCollection[identifier] = true;
anonymousHeld();
} else {
holdFinish(identifier);
}
});
holdFinishCollection.push_back(holdFinish);
}
我可以看到在调试器中holdFinish
指向的实现identifierCollection
与第二个lambda函数中的实现不同。
如果我使用[=, &identifierCollection]
它,则抛出EXC_BAD_ACCESS
是否使用mutable
。
我对其他实现内联函数的语言的经验是,这应该是可能的。例如在javascript中:
var a = 10;
var b = function() {
a += 2;
}
var c = function() {
a += 3;
}
b();
c();
alert(a);
会警惕15
。
我必须怎么做才能使两个lambda函数都引用相同的identifierCollection实现?因此它的行为与javascript示例相同。
与某些脚本语言不同,identifierCollection
不会仅仅因为您将其捕获到一个闭包中而延长了它的生存期。因此,只要您更改[=]
了[&]
要通过引用捕获的值,它便是对要捕获的局部变量的悬挂引用。
您将不得不管理identifierCollection
自己的一生。坦白说,这听起来像是共享指针的绝佳机会,它可以按值捕获到每个lambda中。它包装的动态分配的地图实际上会存在您需要的时间。
void holdAdd(const Rect& rectangle, Hold anonymousHeld, Hold anonymousFinish)
{
auto identifierCollection = std::make_shared<std::map<int,bool>>();
HoldFinish holdFinish = [=](const int& identifier) mutable {
if (identifierCollection->count(identifier) == 0) return;
identifierCollection->erase(identifier);
anonymousFinish();
};
holdCollisionCollection.push_back([=](const int& identifier, const Vec2& point) mutable {
if (rectangle.containsPoint(point)) {
(*identifierCollection)[identifier] = true;
anonymousHeld();
} else {
holdFinish(identifier);
}
});
holdFinishCollection.push_back(holdFinish);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句