针对标题的两种情况,使用起来有一定的特殊性,特此记录下。
至于其他常规的bind使用方法,网上有很多文章有介绍,也可以看这篇文章。

标题的两种情况:
情况一:

这个例子用了两个知识:

第一,关于std::function的使用方法,这是个函数包装器,返回一个可调用对象。
第二,mf = &C::menfunc, 这个是对类的普通成员函数(另外两种是,类静态函数、虚成员函数,用法其实存在差异的)取地址,这里要说明的是:&C::menfunc的返回类型是,void (C::*)(int , int). 所以在语义上(注意不是用法,用法是有差异),mf = &C::menfunc == void (C::*mf)(int , int) = &C::menfunc .
事实上,void (C::*mf)(int , int) = &C::menfunc,的调用方法是:C c; c.*mf(42, 77)。这种调用方法与使用std::function的实现方式,其实从底层实现看是一致的,因为成员函数需要传递一个this指针给作为自己的第一参数,也就是编译器会将c.*mf(42, 77)转换为*mf(&c, 42, 77)
std::function<void(const C&, int, int)>只是上面实现的一种包装形式。
总结上面的用法可以发现,利用bind的绑定未初始化类的成员函数是时,则在调用这个可调用对象时需要另外传递一个对象给其作为参数,这本质上与在绑定时就提供一个对象(这是我们常见的bind类成员函数的用法)是一致的,早提供对象或晚提供对象其实无所谓,二者都是只是在程序真正调用由bind绑定的可调用对象时作为参数传递给函数罢了。

情况二(标黄部分,其他的属于常规bind的用法):

我们将类重载运算符()后的成员函数称之为:函数对象,那么函数对象用在bind有什么特别的地方呢?

第一,函数对象的调用非常友好,当我们实例化一个类的对象后,对对象调用()运算符就可以实现其函数功能:C c; c(42, 17);
第二,函数对象在使用bind的绑定时就会带来普通成员函数不一样的用法,差异就在,当绑定函数对象时,我们直接传递对象就行,假如有auto f4 = bind(C(), _1, _2); ,则f4(42, 17);就能实现调用函数对象的实现。

看下面的例子直接学习用法即可,用法也很直观简单,不得不说,C++11的bind的真是太牛叉了!

#include <iostream>
#include <functional>
#include <typeinfo>using namespace std;
using namespace placeholders;class C {public:C() {}C(int x) {a = x;}int operator () (int x, int y) const {return a + x + y;}int fun (int x) {a = x;return a;}int a = 1;
};int main () {C c;auto f1 = bind(&C::fun, C(), _1);cout << f1(2) << endl;auto f2 = bind(f1, 3);cout << f2() << endl;auto f3 = bind(&C::fun, _1, _2);cout << f3(C(), 4) << endl;auto f4 = bind(C(), _1, _2);cout << f4(2, 2) << endl;auto f5 = bind(c, _1, _2);cout << f5(2, 2) << endl;
}

输出:

c++11 bind直接绑定未初始化类的成员函数、类对象的operater()的方法与区别相关推荐

  1. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  2. C++提高部分_C++类模板成员函数类外实现---C++语言工作笔记092

    然后我们再来说,类模板成员函数的类外实现 上面我们写一个Person类,然后 类模板template 然后写一个Person构造方法,然后,写一个showPerson方法 然后后面我们要用字符串,我们 ...

  3. C++ 类的成员函数指针 ( function/bind )

    这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...

  4. C++11多线程,thread库; mutex类,成员函数lock(), unlock();unique_lock<mutex>模板类

    文章目录 进程和线程 1. 进程 2. 线程 C++11多线程编程 1. C++11新标准 2. 创建线程 1. 普通函数 2. 仿函数 3. 成员函数 4. 多线程数据保护(数据一致性) 进程和线程 ...

  5. C++ 类的成员函数

    C++ 类的成员函数 一.普通成员函数 1.普通成员函数的声明 2.普通成员函数的定义方式 3.普通成员函数的调用方式 二.构造函数 1.构造函数的分类 2.构造函数的特点 3.构造函数的作用 4.构 ...

  6. java设计一个顺序表类的成员函数_顺序表代码讲解以及实现

    用C语言编写一个有关顺序表的程序代码 创建一个顺序表,其数据元素类型为整型: 在该顺序表中插入数据(#include #include #define MaxSize 50 typedef char ...

  7. python类的成员函数_Python实现动态添加类的属性或成员函数的解决方法

    某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或 ...

  8. C++类特殊成员函数

    class特殊成员函数 类隐式定义的成员六个函数 默认构造函数 析构函数 复制构造函数 复制构造函数 移动构造函数和赋值 隐式成员 类隐式定义的成员六个函数 特殊成员函数是在某些情况下隐式定义为类成员 ...

  9. 类的成员函数与内联以及静态成员

    一.类的成员函数与内联 在类内定义的所有函数都自动称为内联函数.如果在类内声明,在类外定义,也可以定义为内联函数.在定义函数时添加inline限定符.. (1)此外,内联函数一定要和函数定义在一起,否 ...

最新文章

  1. OpenDNSSEC 1.3.12 发布
  2. LIVE555再学习 -- VLC搭建RTSP服务器(转)
  3. N551JM集显和独显切换
  4. WPF依赖属性(续)(1)
  5. linux保存日志报错,为什么在Linux上错误mongod死了,但子系统被锁定,可用空间不足以存放日志文件?...
  6. Hibernate,Ibatis,Jdbc 区别
  7. 【Python】django模型models的外键关联使用
  8. Introduction to Computer Networking学习笔记(十五):End to End Delay 端对端延迟
  9. 2021软考资料汇总:历年真题/学习手册/学习计划/考试大纲等资料
  10. android 开源 视频播放器,安卓视频播放器——ijkPlayer(Bilibili开源)
  11. bind 完成正确安装
  12. Linux下载安装Netcat
  13. 查看主机oracle 版本,CentOS下查看Oracle数据库版本
  14. 明日方舟 红松林故事集
  15. cad图纸问号怎么转换文字_cad打开后图形文字显示问号该怎么办?
  16. php文件怎么打开?怎么打开PHP文件?
  17. docker启动失败
  18. MATLAB频域图像处理
  19. 【16人抢答器程序】
  20. 2018年重庆大学——唐立新奖学金面试经历总结

热门文章

  1. Java8中Collectors的使用
  2. surface-distance安装
  3. 3D打印高跟鞋Mycelium Shoe 前卫与舒适兼俱
  4. Flink生成Parquet格式文件实战
  5. python tkinter怎么安装_Python的Tkinter库的安装
  6. java添加文档注释_添加Java文档注释
  7. NotifyICon使用
  8. eclipse怎样自动引入包--Organized Imports
  9. JS学习笔记二——JavaScript 基础知识
  10. 电大计算机flash期末考试题,电大(精新编版)开放教育计算机网络专业(专科)《flash动画制作》期末复习考试试题及参考答案__2017年度.doc...