C++ 中的闭包
Posted cpp有效编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 中的闭包相关的知识,希望对你有一定的参考价值。
C++ 中的闭包
闭包的概念:
闭包就是能够读取其他函数内部变量的函数。
在很多编程语言中都有闭包的概念,譬如:python,js,lua等等
python中的闭包
def outer_func():
inner_value = 10
def inner_func(name):
print(inner_value)
print(name)
return inner_func
f = outer_func()
f("Hello")
上面的outer_func 返回一个函数,而返回的函数拥有了状态,这个状态是outer_func里面的对象。
c++ 11中是如何实现闭包
发现c++实现闭包有两种方式
std::function + std::bind
std::function + lambda
std::function + std::bind的实现方式,(推荐的使用方式)
void foo(int a, int b)
{
cout << "a: " << a << endl;
cout << "b: " << b << endl;
}
void foo1(int a, int b, int c)
{
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
}
int main()
{
auto f1 = std::bind(foo, std::placeholders::_1, 10);
f1(100);
// f2可以保存各种状态,callable的object的参数格式和function参数格式一致即可。
std::function<void(int)> f2;
f2 = std::bind(foo, std::placeholders::_1, 20);
f2(100);
f2 = std::bind(foo, std::placeholders::_1, 30);
f2(100);
// ===============
f2 = std::bind(foo1, std::placeholders::_1, 10, 20);
f2(100);
}
std::function + lambda 的实现方式
void foo(int a, int b)
{
cout << "a: " << a << endl;
cout << "b: " << b << endl;
}
void foo1(int a, int b, int c)
{
cout << "a: " << a << endl;
cout << "b: " << b << endl;
cout << "c: " << c << endl;
}
int main()
{
auto f1 = [](int x) {
foo(x, 20);
};
f1(100);
auto f2 = [](int x) {
foo1(x, 20, 30);
};
f2(200);
}
如果有需要,lambda需要通过copy value的方式把值传递进去给lambda函数,如果要传递的对象过大,则使用shared_ptr进行优化
闭包的作用
最直接的是在函数中有了对象的状态
对程序表达能力的改进,譬如对设计模式的简化
以上是关于C++ 中的闭包的主要内容,如果未能解决你的问题,请参考以下文章