std::function和std::bind

std::function和std::bind

std::function

  1. 可调用对象
    • 是一个函数指针
    • 是一个具有operator()成员函数的类和对象
    • 可被转换成函数指针的类对象;
    • 一个类成员函数指针;

C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。

// 普通函数
int add(int a, int b){return a+b;} // lambda表达式
auto mod = [](int a, int b){ return a % b;}// 函数对象类
struct divide{int operator()(int denominator, int divisor){return denominator/divisor;}
};

上述表达式虽然不同但是是同一种调用形

int(int,int)

std::function就可以将上述类型保存下来

std::function<int(int ,int)>  a = add; 
std::function<int(int ,int)>  b = mod ; 
std::function<int(int ,int)>  c = divide(); 

std::bind

可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:

  • 将可调用对象和其参数绑定成一个防函数;
  • 只绑定部分参数,减少可调用对象传入的参数。

std::bind绑定普通函数

double my_divide (double x, double y) {return x/y;}
auto fn_half = std::bind (my_divide,placeholders::_1,2);  
std::cout << fn_half(10) << '\n';                      
  • bind的第一个参数是函数名,回隐式转换为函数指针,所以写成&my_divide也可以;
  • 第二个参数是占位符,placeholders::_1自动匹配第一个参数
  • 占位符可以有多个
  • 第三个参数是默认值,调用时第二个参数默认是2;(如果调用时第二个参数你指定了,那也没有用,还是使用2);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何理解Bounce Rate和Exit Rate

先说说两者的定义&#xff1a; 1&#xff09;Bounce Rate&#xff1a;从某个特定的页面进入网站的Visit中&#xff0c;有多少百分比什么都没有做&#xff08;没有点击任何链接&#xff09;&#xff0c;然后就离开了网站&#xff08;即关闭了这个特定的页面&#xff09;。例如&a…

我的blog开张了,希望大家能多多赏光啊

今天&#xff0c;风很大&#xff0c;前两天刚刚有点春天的感觉&#xff0c;今天全被风刮没了。上网碰到以前很好的同事&#xff0c;谈到如果他也成家了&#xff0c;我们还会不会这样肆无忌惮的说着心事&#xff1f;他说不会的&#xff0c;但是我觉得那是他还没有结婚&#xff0…

配置 Sybase数据源

1.Start-- > All Programs -- > Sybase - -> Connectivity --> click ‘Open Client Directory Service Editor’ 2.在Server窗口右击鼠标 Right Click -- > select ‘Add’ item 3 弹出’Input Server Name’窗口,输入Server name(服务器名称) ServerName: DM…

C++虚函数表

虚函数 对C 了解的人都应该知道虚函数&#xff08;Virtual Function&#xff09;是通过一张虚函数表&#xff08;Virtual Table&#xff09;来实现的。简称为V-Table。在这个表中&#xff0c;主是要一个类的虚函数的地址表&#xff0c;这张表解决了继承、覆盖的问题&#xff0…

Proxy Pattern using C# (转载)

Proxy Pattern&#xff08;代理模式&#xff09;属于Structural Pattern&#xff08;结构型模式&#xff09;&#xff0c;Proxy Pattern-为Client真正要调用的对象提供一个代理&#xff08;Surrogate or placeholder&#xff09;&#xff0c;来控制Client对该对象的访问。 1. U…

【设计模式】五、单例模式(独一无二的对象)

一、概述&#xff1a; 有一些对象我们只需要一个&#xff0c;比方说&#xff1a;线程池&#xff08;threadpool&#xff09;、缓存&#xff08;cache&#xff09;、对话框、处理偏好设置和注册表对象、日志对象、充当打印机、显卡等设备的驱动程序的对象。事实上这些对象只需要…

C++变长参数模板

C变长参数模板 C11 加入了新的表示方法: 允许任意个数、任意类别的模板参数&#xff0c;同时也不需要在定义时将参数的个数固定。 template<typename... Ts> class Magic;模板类 Magic 的对象&#xff0c;能够接受不受限制个数的 typename 作为模板的形式参数&#xff…

数据库设计方法、规范与技巧

本文链接&#xff1a;http://www.openphp.cn/index.php/art.../100/index.html  一、数据库设计过程  数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境&#xff0c;构造最优的数据库模式&#xff0c;建立数据库及其应用系统&#xff0c;有效存…

C++并行与并发

第 7 章 并行与并发 文章目录第 7 章 并行与并发7.1 并行基础7.2 互斥量与临界区7.3 期物7.4 条件变量7.5 原子操作与内存模型原子操作一致性模型内存顺序总结习题进一步阅读的参考资料7.1 并行基础 std::thread 用于创建一个执行的线程实例&#xff0c;所以它是一切并发编程的…

java 中String ,Date,long 和Timestamp类型的转换

一、String与Date(java.util.Date)的转换 1、String--->Date String str"2014/1/11 12:34:25"; Date datenew Date(); DateFormat sdf new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); //这里规定时间的格式要与String时间类型的格式相同 datesdf.pars…

BlackBerry 应用程序开发者指南 第一卷:基础--第5章 支持的媒体内容(Media Content)...

作者:Confach 发表于April 23,2006 15:02 pm版权信息:可以任意转载, 转载时请务必以超链接形式标明文章原始出处 和作者信息.http://www.cnblogs.com/confach/articles/387902.html5第5章 支持的媒体内容&#xff08;Media Content&#xff09;PME内容 播放媒体内容 监听媒体内…

Qt 入门 ---- 如何在程序窗口显示图片?

步骤&#xff1a; 1. 选择资源&#xff08;准备图片&#xff09; 2. 加载资源&#xff08;导入图片&#xff09; 3. 使用资源&#xff08;显示图片&#xff09; 具体操作流程&#xff1a; ① 从网上寻找合适的图片素材&#xff0c;下载到本地&#xff0c;在项目根目录下创建一个…

Enterprise Library 2.0 技巧(3):记录ASP.NET站点中未处理的异常

这篇文章不能算是Enterprise Library 2.0的一个技巧&#xff0c;只是Logging Application Block的一个简单应用而已&#xff0c;在这里我们使用Logging Application Block来记录一个ASP.NET 2.0站点中未处理的异常到数据库中&#xff0c;当然你也可以记录到文本文件中&#xff…

Hadoop 2.2.0源码浏览:4. NodeManager

基本流程public static void main(String[] args) {Thread.setDefaultUncaughtExceptionHandler(new YarnUncaughtExceptionHandler());StringUtils.startupShutdownMessage(NodeManager.class, args, LOG);NodeManager nodeManager new NodeManager();Configuration conf ne…