C++中的 JavaScript 样式闭包

Javascript style closure in C++

本文关键字:闭包 样式 JavaScript 中的 C++      更新时间:2023-10-16

首先,抱歉,这个标题可能让你们中的一些人在嘴里吐了一点。但是,让我解释一下我想要完成的目标。

我正在将一个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;
}

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

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;
}

看来我误解了javascript中允许这种行为发生的情况。深入挖掘后,我现在看到闭包中唯一可用的变量是当变量定义在闭包定义的父范围内时:

var funcB = function(funcA){
funcA();
};
(function(){
var firstVar = 1;
var secondVar = 2;
funcB(function(){
alert(firstVar + secondVar);
});
})();

在C++中使用 lambda 捕获(如用户@Marek R 在有问题的评论中所建议的那样(可以实现相同的行为,如下所示:

void funcB(std::function<void()> funcA) {
funcA();
}
int main() {
int firstVar = 1;
int secondVar = 2;
funcB([&]() {
std::cout << firstVar + secondVar;
});
std::cin.get();
return 0;
}

因此,我最初的问题源于我不知道的事情。为了实现我的实际目标,我必须将参数传递给我的 lambda 或实现不同的设计模式。