admin管理员组文章数量:1439709
【C++11】闭包:仿函数operator() && 绑定器bind && 包装器functino && lambda表达式
Ⅰ. 什么是闭包
闭包有很多种定义, 一种说法是, 闭包是带有上下文的函数。 说白了, 就是有状态的函数,就是有自己的变量。更直接一些, 就是一个类 换了个名字而已。
一个函数, 带上了一个状态, 就变成了闭包了。 那什么叫 “带上状态” 呢? 意思是这个闭包有属于自己的变量, 这些个变量的值是创建闭包的时候设置的, 并在调用闭包的时候, 可以访问这些变量。
函数是代码, 状态是一组变量, 将代码和一组变量捆绑 (bind
) , 就形成了闭包。 闭包的状态捆绑, 必须发生在运行时。
Ⅱ. 闭包的实现方式
一、仿函数:重载operator()
之前我们在学 std::list
等容器模拟实现的时候讲到了仿函数,其实就是用一个类,在类中重载 operator()
即可达到类似函数的调用方式,本质上就是一个重载 ()
的函数!
#include<iostream>
class MyFunctor
{
public:
MyFunctor(int tmp)
:round_(tmp)
{}
int operator()(int tmp) // 仿函数,重载operator()
{
return round_ + tmp;
}
private:
int round_; // round_就是这个闭包的状态
};
int main()
{
int round = 2;
MyFunctor mf(round); // 调用构造函数
// 调用仿函数
std::cout << "result = " << mf(1) << std::endl; // operator()(int tmp)
return 0;
}
// 运行结果:
result = 3
二、绑定器与包装器
C++ 11中的std::bind和std::function std::function与std::bind使用总结 包装器和绑定器std::bind和std::function的回调技术
C++
中函数指针的用途非常广泛,例如回调函数,接口类的设计等,但函数指针始终不太灵活,它只能指向全局或静态函数,对于类成员函数、lambda
表达式或其他可调用对象就无能为力了,因此,C++11
推出了 std::function
与 std::bind
这两件大杀器。
① std::function包装器
官方文档
C++
中, 可调用实体主要包括:函数、函数指针、函数引用、可以隐式转换为函数指定的对象,或者实现了 opetator() 的对象。
而 C++11
中, 新增加了一个 std::function
类模板, 它是对 C++
中现有的可调用实体的一种类型安全的包裹。 通过指定它的模板参数, 它可以用统一的方式处理函数、 函数对象、 函数指针,并允许保存和延迟执行它们。
std::function
对象最大的用处就是在实现函数回调,使用者需要注意,虽然它不能被用来检查相等或者不相等,但是可以与 NULL
或者 nullptr
进行比较。
本文标签: C11闭包仿函数operator() ampamp 绑定器bind ampamp 包装器functino ampamp lambda表达式
版权声明:本文标题:【C++11】闭包:仿函数operator() && 绑定器bind && 包装器functino && lambda表达式 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1747675845a2742085.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论