admin管理员组

文章数量:1439709

【C++11】闭包:仿函数operator() && 绑定器bind && 包装器functino && lambda表达式

Ⅰ. 什么是闭包

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

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

函数是代码, 状态是一组变量, 将代码和一组变量捆绑 (bind) , 就形成了闭包。 闭包的状态捆绑, 必须发生在运行时。

Ⅱ. 闭包的实现方式

一、仿函数:重载operator()

​ 之前我们在学 std::list 等容器模拟实现的时候讲到了仿函数,其实就是用一个类,在类中重载 operator() 即可达到类似函数的调用方式,本质上就是一个重载 () 的函数

代码语言:javascript代码运行次数:0运行复制
#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::functionstd::bind 这两件大杀器。

① std::function包装器

官方文档

C++ 中, 可调用实体主要包括:函数、函数指针、函数引用、可以隐式转换为函数指定的对象,或者实现了 opetator() 的对象。

​ 而 C++11 中, 新增加了一个 std::function 类模板, 它是对 C++ 中现有的可调用实体的一种类型安全的包裹。 通过指定它的模板参数, 它可以用统一的方式处理函数、 函数对象、 函数指针,并允许保存和延迟执行它们。

std::function 对象最大的用处就是在实现函数回调,使用者需要注意,虽然它不能被用来检查相等或者不相等,但是可以与 NULL 或者 nullptr 进行比较。

本文标签: C11闭包仿函数operator() ampamp 绑定器bind ampamp 包装器functino ampamp lambda表达式