参考博客: C++可调用对象详解-https://www.cnblogs.com/Philip-Tell-Truth/p/5814213.html

  一、关于std::function与std::bind

  翻看了几篇博客,还不如看书逻辑性好。以下内容摘自祁宇《深入应用C++11: 代码优化与工程级应用》一书。

  有以下4种情况可被称为可调用对象。

  1、是一个函数指针。(这里的函数要求是如C函数一样的编译期内存确定的函数指针)

  2、是一个具有operator()成员函数的类对象。(让类重载调用操作符operator(),关键在于是以类对象调用形式调用)

  3、是一个可被转换为函数指针的类对象。(这一点与2是一样的,函数可以使用函数名+operator的形式调用,也可以使用函数指针如  void(*p)(int); p = test;

    (*p) (n); 注意看下面例子中的这一种情况)

  4、是一个类成员(函数)指针。

  例子:

  void func( void) { // ... }

  struct Foo {

    void operator()( void) { // ... }

   };

  struct Bar {

    using fr_ t = void(*)( void);       //void (*)(void)相当定义了一种函数指针类型!!!

    static void func( void) { // ... }   //一定要是static

    operator fr_ t( void) { return func; }

  };

  struct A{

    int a_;

    void mem_ func( void) { // ... }

  };

  使用:

   int main( void) {

    void(* func_ ptr)( void) = &func; // 1. 函数 指针

    func_ ptr();

    Foo foo; // 2. 仿 函数

    foo();

    Bar bar; // 3. 可被 转换 为 函数 指针 的 类 对象

    bar();

    void (A::* mem_ func_ ptr)( void)= &A:: mem_ func;  // 4. 类 成员 函数 指针

    int A::* mem_ obj_ ptr = &A:: a_;                               // 或者是 类 成员 指针

A aa;

    (aa.* mem_ func_ ptr)();

         aa.* mem_ obj_ ptr = 123;

return 0;

}

  std::function是可调用对象的包装器(也就是说std::function对上面几种情况做了封装),可以容纳除了类成员(函数)指针外(不包括上面列出来的4!)的所有可调用对象。通过制定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存于延迟执行他们。 

  如定义  std::function<void (void)> fc = func;  fc(); //等同于调用func

  std::function包括了C++中的可调用对象,让上述列出来的签3中情况就有了一个方便操作的对象属性。

    std::bind可以让上面的第4中情况也变成一个方便使用的std::function对象,C++中函数指针的使用一定要上调用者对象。

  如下代码:

  #include < iostream>

  #include < functional>

  class A {

    public:

    int i_ = 0;

    void output( int x, int y) { std:: cout << x << " " << y << std:: endl;}

   };

  int main( void)

  {

    A a;

    std:: function< void( int, int)> fr = std:: bind(& A:: output, &a, std:: placeholders::_ 1 , std:: placeholders::_ 2);

    fr( 1, 2);

  }

  针对类成员函数指针,std::bind就填入了调用者a的地址值,使它变成了一个方便易用的std::function对象。

  二、lambda表达式

  语法:[ capture ] ( params ) opt -> ret { body; };

  其中最有意思的应该是capture这个属性了吧。有空来补充吧,吃饭去!

C++11 std::function、std::bind和lambda表达式的更多相关文章

  1. C++11 中function和bind以及lambda 表达式的用法

    关于std::function 的用法:  其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...

  2. 【转载】C++ function、bind和lambda表达式

    本篇随笔为转载,原贴地址:C++ function.bind和lambda表达式. 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制 ...

  3. c++11——std::function和bind绑定器

    c++11中增加了std::function和std::bind,可更加方便的使用标准库,同时也可方便的进行延时求值. 可调用对象 c++中的可调用对象存在以下几类: (1)函数指针 (2)具有ope ...

  4. C++11 学习笔记 std::function和bind绑定器

    C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...

  5. c++11新标准for循环和lambda表达式

    :first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...

  6. C++ 11 std::function std::bind使用

    cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNorm ...

  7. C++11学习笔记之三lamda表达式,std::function, std::bind

    //lamda //first lamda [] {}; // second lamda []() //or no need () when paramater is null { std::cout ...

  8. C++11 中的function和bind、lambda用法

    std::function 1. std::bind绑定一个成员函数 #include <iostream> #include <functional> struct Foo ...

  9. std::function,std::bind复习

    #include <iostream> #include <functional>//std::bind返回函数对象 void fun1(int a, int b) { std ...

随机推荐

  1. bzoj2748 [HAOI2012]音量调节 背包

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  2. Linux(11):期中架构(3)--- SSH远程管理服务 & ansible 批量管理服务

    SSH远程管理服务 1. 远程管理服务知识介绍 # 1.1 SSH远程登录服务介绍说明 SSH是Secure Shell Protocol的简写,由 IETF 网络工作小组(Network Worki ...

  3. SpringBoot项目整合Druid进行统计监控

    0.druid介绍,参考官网 1.在项目的POM文件中添加alibaba的druid依赖 <dependency> <groupId>com.alibaba</group ...

  4. BZOJ1902: Zju2116 Christopher

    $n \leq 10^{100}$,问$C_n^m,0<=m<=n$有多少是质数$p \leq 1e7$的倍数. 一样,套高精度的题,只有战胜他才能鄙视他. 但是我TM被他鄙视了一上午!! ...

  5. hdu 5012 bfs 康托展开

    Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  6. jstl 标签 的应用

    参考文档:http://www.yiibai.com/jsp/jstl_core_choose_tag.html 1.jstl中foreach序号 <c:forEach items=" ...

  7. cssnext下一代的css

    前端技术更新迭代的速度令人咂舌,互联网+的风头刚起那几年,前端技术大多还停留在jquery阶段,按需加载还停留在seajs和requirejs的阶段,css3和H5也不过才崭露头角,但经过几年的飞速发 ...

  8. Docker如何部署Python项目

    Docker 部署Python项目 作者:白宁超 2019年5月24日09:09:00 导读: 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如 ...

  9. ros使用罗技f710无线控制手柄

    参考:blog.csdn.net/hcx25909/article/details/9042469 罗技F710无线控制手柄ROS下使用说明 安装手柄相关的包和驱动 sudo apt-get inst ...

  10. 洛谷P1865 A % B Problem

    1.洛谷P1865 A % B Problem 题目背景 题目名称是吸引你点进来的 实际上该题还是很水的 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行 ...