我希望能够在两个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);
}

关于c++ - 在两个Lambda之间共享变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30823836/

10-13 07:29