C++的闭包(closure)

闭包是一种带有上下文状态的函数,即函数与一组变量捆绑,形成有状态的函数对象。C++中闭包的实现通常通过重载operator(),利用成员变量保存状态。此外,C++11的lambda表达式和std::bind提供了简洁的闭包实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是闭包

闭包有很多种定义,一种说法是,闭包是带有上下文的函数。说白了,就是有状态的函数。更直接一些,不就是个类吗?换了个名字而已。

一个函数,带上了一个状态,就变成了闭包了。那什么叫 “带上状态” 呢? 意思是这个闭包有属于自己的变量,这些个变量的值是创建闭包的时候设置的,并在调用闭包的时候,可以访问这些变量。

函数是代码,状态是一组变量,将代码和一组变量捆绑 (bind) ,就形成了闭包。

内部包含 static 变量的函数,不是闭包, 因为这个 static 变量不能捆绑。你不能捆绑不同的 static 变量,这个在编译的时候已经确定了。

闭包的状态捆绑,必须发生在运行时。

闭包的实现

重载 operator()

因为闭包是一个函数+一个状态, 这个状态通过隐含的 this 指针传入,所以闭包必然是一个函数对象,因为成员变量就是极好的用于保存状态的工具,因此实现 operator() 运算符重载,该类的对象就能作为闭包使用。默认传入的 this 指针提供了访问成员变量的途径。

class MyFunctor
{public:
 MyFunctor(int tmp) : round(tmp) {}
 int operator()(int tmp) { return tmp + round; }private:
 int round;
};
int main()
{
 int round = 2;
    MyFunctor f(round);//调用构造函数
    cout << "result = " << f(1) << endl; //operator()(int tmp)
 
 return 0;
}
lambda表达式
C++11 里提供的 lambda表达式就是很好的语法糖,其本质和手写的函数对象没有区别:
 int round = 2;
 auto f = [=](int f) -> int { return f + round; } ;
 cout << "result = " << f(1) << endl;

lambda表达式

C++11 里提供的 lambda表达式就是很好的语法糖,其本质和手写的函数对象没有区别:

 int round = 2;
 auto f = [=](int f) -> int { return f + round; } ;
 cout << "result = " << f(1) << endl;

std::bind

标准库提供的 bind 是更加强大的语法糖,将手写需要很多很多代码的闭包,浓缩到一行 bind 就可以搞定了。

#include <iostream>#include <functional>using namespace std;
int func(int tmp, int round)
{
 return tmp + round;
}
int main()
{
 using namespace std::placeholders;    // adds visibility of _1, _2, _3,...
 int round = 2;
 std::function<int(int)> f = std::bind(func, _1, round);
 cout << "result = " << f(1) << endl;
 return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值