在两个Lambda之间共享变量

理查德·西姆金斯

我希望能够在两个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在两个Lambda之间共享对象

在两个线程之间共享时间变量

Angular 5在两个组件之间共享变量

仅在两个类之间私下共享变量 - Java

在两个独立的shell脚本之间共享变量

如何在两个函数之间共享公共变量

如何在没有服务的情况下在两个组件之间共享共享变量

两个类之间的共享方法

在两个容器之间共享/ tmp

两个JVM之间的共享内存

在两个容器之间共享文件

Java在两个线程之间共享一个变量

在 C 中的两个文件之间共享一个变量

如何在cro中的两个路由器模块之间共享变量?

如何在两个或多个Servlet之间共享变量或对象?

在更新时立即反映对两个线程之间的共享变量所做的更改

使用主js中定义的变量在两个vue文件之间共享数据

在同一包中的两个源文件之间共享变量

如何在两个 C++ 类之间共享互斥量、条件变量和队列?

如何在两个分别运行的python脚本之间共享变量

在 Firefox 扩展中的两个后台脚本之间共享变量

标识R中两个变量之间不共享的索引

如何在两个Linux内核模块之间共享全局变量?

AngularJS-在两个控制器之间共享变量

Angular 5在两个组件之间共享函数和变量

在Azure DevOps的发布管道中的作业代理的两个任务之间共享PowerShell变量

如何在函数生成的两个文件之间共享变量

我无法使用mvvm在两个存储库之间共享变量

代表是在两个窗口之间共享变量的好方法吗?