C++中的 JavaScript 样式闭包
Javascript style closure in 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;
}
在这个特定的例子中,惯用的方式是使用返回值:
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 或实现不同的设计模式。
相关文章:
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- C++中的 JavaScript 样式闭包
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 使用带有闭包的 lambda 的回调
- C++中的 Lambda <-> 闭包等价性
- 为什么 std::remove_if 会创建如此多的闭包?
- Lambda闭包左值可以作为右值参考参数传递
- 如何声明接受字符串、返回void的闭包的类型
- 添加了闭包的 Perl newXS()
- 具有意外结果的 C++ 闭包
- 关于函数模板中定义的 lambda 闭包类型可以说些什么?
- 基类如何调用派生类在 c++ 中传递的闭包?
- 通过引用将自定义结构的向量传递给 boost::compute 闭包或函数
- 创建特征以检测C++中的闭包类型
- 在 c++ 中使用函数装饰器(使用闭包)时出现意外的分段错误
- Lambda 表达式闭包函数不起作用
- Lambda 闭包类型构造函数
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- boost::compute,将指针传递给闭包
- 没有声明和初始化的类似闭包的函数(即没有'auto f = make_closure();')