对在多个 lambda 中捕获的对象进行操作

Operating on objects captured in multiple lambdas

我正在使用 esp8266 制作一个简单的自制 IoT 解决方案,使用内置库作为 Web 服务器路由。这些 lib 函数不喜欢使用带参数的函数,所以我的解决方案是使用 lambda 并捕获我需要的变量。问题是当尝试对来自两个不同 lambda 的对象的同一实例进行操作时,当使用 pinPower setter 方法更新存储引脚功率的 int(1 或 0,是的,我知道 bool 会更好) 一个 lambda 的变化不会出现在另一个 lambda 中。

我认为这与 lambdas 按值捕获变量并创建我的 class 的新实例有关;我已经尝试捕获 outputPinArray[i] 作为参考,但这只是意味着 getter 函数未能获得正确的值,因此未能完成切换值(class 使用 getter 内部)。使用静态变量和 getter 函数有效,但我希望能够使用 class 的多个实例,因此不想要这样的共享变量。我已经看到各种帖子似乎都指向使用 extern 关键字进行捕获,但我没有找到太多关于在 lambda 中使用它的文档,也无法弄清楚如何正确使用它。

这是我正在使用的代码:

for(int i = 0; i < 1; i++) {
    server.on(path, HTTP_POST, [outputPinArray , argToCheck, i]() mutable {
        // Sets pinNumber variable and turns on or off the arduino pin using outputPinArray[i].setPinPower or .togglePinPower    
    });


    server.on(path, HTTP_GET, [outputPinArray,i](){
        // Send integer value using outputPinArray[i].getPinPower()
    });
}

outputPin class代码:

int OutputPin::getPinPower(){
    return pinPower;
}

void OutputPin::setPinPower(int value){
    if(value == HIGH || value == LOW){
        pinPower = value;
        digitalWrite(getPinNum(), pinPower);
}

感谢任何帮助,谢谢!

如果我正确理解你的问题,你需要做的就是

server.on(path, HTTP_POST, [&outputPinArray , argToCheck, i]()  {

我失败了,当路由是全局声明的 esp8266webserver 对象时,数组超出了范围。在@obamator

的帮助下解决了