c++ - 在两个 lambda 之间共享变量

标签 c++ lambda anonymous-function capture

我希望能够在两个 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 指向与第二个 lambda 函数不同的 identifierCollection 实现。

如果我使用 [=, &identifierCollection],无论我是否使用 mutable,它都会抛出一个 EXC_BAD_ACCESS

我对其他实现内联函数的语言的经验是,这应该是可能的。例如在 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 中。只要您需要,它所包含的动态分配 map 就会一直存在。

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/

相关文章:

java - kotlin:2个lambda参数的语法

javascript - 在javascript中调用匿名函数

c++ - 在 C++ vector 的每个元素上调用函数

python - 基于具有非空值的另一列,使用 lambda 在数据框中创建一列

c++ - 如何按值对 LevelDB 进行排序

c# - 没有 lambda 表达式的 Entity Framework 查询

python - 如何在Dart中创建某些类类型的对象的列表?

addEventListener 匿名函数中的 Javascript 变量范围

android - NDK 中 undefined reference 错误

c++ - 将 _bstr_t com 属性分配给 LPCTSTR 是否安全?