首页 > 解决方案 > C++ 中的 Javascript 样式闭包

问题描述

首先,很抱歉,因为这个标题可能让你们中的一些 c++ 人有点吐在你的嘴里。但是,让我解释一下我要完成的工作。

我将一个 lambda(称为 funcA)作为参数传递给另一个函数(称为 funcB)。有没有办法让我在 funcB 中声明变量并在 funcA 范围内访问它们而不将它们作为参数传递给 funcA,类似于 javascript 闭包的工作方式?

一个简单的例子(显然失败)如下:

void funcB(std::function<void()> funcA) {
    int testInt = 44;
    funcA();
}

int main() {
    funcB([&]() {
        std::cout << testInt; // undefined identifier
    });

    return 0;
}

标签: c++lambdaclosures

解决方案


那么在这个特定的例子中,惯用的方法是使用返回值:

void funcB(std::function<int()> funcA) {
    int testInt = funcA();
}

int main() {
    funcB([&]() {
        int testInt = 44;
        std::cout >> testInt;
        return testInt;
    });

    return 0;
}

可以使用输出参数,但不太常用:

void funcB(std::function<void(int&)> funcA) {
    int testInt = 44;
    funcA(testInt);
}

int main() {
    funcB([&](int& testInt) {
        std::cout >> testInt;
    });

    return 0;
}

推荐阅读