从成员函数指针生成可调用对象:function<>、mem_fn()和bind()
我们知道,普通函数指针是一个可调用对象,但是成员函数指针不是可调用对象。因此,如果我们想在一个保存string的vector中找到第一个空string,不能这样写:
- vector<string> svec;
- //...初始化
- auto f = &string::empty; //fp是一个成员函数指针,指向string的empty函数
- find_if(svec.begin(), svec.end(), fp); //错误 find_if算法需要一个可调用对象,但是fp是一个指向成员函数的指针
这里find_if算法查找第一个具有特定大小的元素,类似find算法,find_if算法接受一个迭代器,表示一个范围,第三个参数是一个是一个谓词,find_if算法对输入序列中的每个元素调用这个指定的谓词(可调用表达式,其返回结果是一个能用作条件的值),返回第一个使谓词返回非0值的元素,如果不存在这样的元素,返回尾后迭代器。简单的说,就是从输入序列中返回第一个满足谓词的值。
我们可以使用三种方式从指向成员函数的指针fp生成一个可调用对象:
1.使用function生成一个可调用对象
- function<bool (const string&)> fcn = &string::empty;
- find_if(svec.begin(),svec.end(),fcn)
2.使用mem_fn生成一个可调用对象
mem_fn()把可以从成员指针生成一个可调用对象,与function不同,mem_fn可以根据成员指针的类型推断可调用对象的类型,无序用户显式地指定:
- find_if(svec.begin(), svec.end(), mem_fn(&string::empty));
使用mem_fn(&string::empty)生成一个可调用对象,该对象接受一个string实参,返回一个bool值。
mem_fn生成的可调用对象可以通过对象调用,也可以通过指针调用:
- auto f = mem_fn(&string::empty); //f接受一个string或者string*
- f(*svec.begin()); //传入一个string对象,f使用.*调用empty
- f(&svec[]); //传入一个string对象,f使用->*调用empty
可以认为mem_fn生成的可调用对象含有一堆重载的函数调用运算符:一个接受string*,另一个接受string&。
3.使用bind生成一个可调用对象
- auto it = find_if(svec.begin(), svec.end(), bind(&string::empty,_1));
与mem_fn类似,bind生成的可调用对象的第一个实参既可以是string的指针,也可以是string的引用:
- auto f = bind(&string::empty,_1);
- f(*svec.begin()); //正确:实参是一个string, f使用.*调用empty
- f(&svec[]); //正确:实参是一个string的指针, f使用->*调用empty
下面的例子来自cplusplus上mem_fn的用法:
- // mem_fn example
- #include <iostream> // std::cout
- #include <functional> // std::mem_fn
- struct int_holder {
- int value;
- int triple() {return value*;}
- };
- int main () {
- int_holder five {};
- // 直接调用成员函数
- std::cout << five.triple() << '\n'; //15
- // 使用mem_fn调用
- auto triple = std::mem_fn (&int_holder::triple);
- std::cout << triple(five) << '\n'; //
- return ;
- }
参考:http://www.cplusplus.com/reference/functional/mem_fn/
《C++ primer》
从成员函数指针生成可调用对象:function<>、mem_fn()和bind()的更多相关文章
- C/C++ 类成员函数指针 类成员数据指针
普通函数指针: "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*p ...
- 成员函数指针与高性能C++委托
1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...
- [转]成员函数指针与高性能的C++委托
原文(作者:Don Clugston):Member Function Pointers and the Fastest Possible C++ Delegates 译文(作者:周翔): 成员函数指 ...
- 成员函数指针,动态绑定(vc平台)
上一篇介绍了gcc对成员函数指针做了thunk的处理,本篇介绍vc对成员函数指针如何处理,还有动态绑定相关的处理. 同样用回上一篇的例子: struct point {float x,y;}; str ...
- 自制反汇编工具使用实例 其二(使用xmm寄存器初始化对象,以及空的成员函数指针)
在反汇编代码中,当看到xmm寄存器,第一反应是将要进行浮点操作或访问,但是更加多的情况是在使用xmm寄存器初始化局部对象. 下面是自制反汇编工具翻译出来的代码: // -[CALayer setAll ...
- 获得函数返回值类型、参数tuple、成员函数指针中的对象类型
//function_traits.h,获得函数返回值类型.参数tuple.成员函数指针中的对象类型 //参考https://github.com/qicosmos/cosmos/blob/maste ...
- C++的类成员和类成员函数指针
类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...
- Item 17: 理解特殊成员函数的生成规则
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 C++的官方说法中,特殊成员函数是C++愿意去主动生成的.C++9 ...
- 成员函数指针与高效C++委托 (delegate)
下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...
随机推荐
- Vue、webpack中默认的config.js、index.js 配置详情
在vue.js 框架搭建好后,其vue-cli 自动构建的目录里面相关环境变量及其基本变量配置,如下代码所示: module.exports = { build: { index: path.reso ...
- c#压缩和解压缩
C# 文件/文件夹压缩解压缩 项目上用到的,随手做个记录,哈哈. 直接上代码: 1 using System; 2 using System.Data; 3 using System.Config ...
- C# 调用cmd执行命令
private void CmdRun_Click(object sender, EventArgs e) { Process p = new Process(); ...
- Mac 升级 Python2.7 到 Python3.5
1.去 Python 官网下载一个版本的包 https://www.python.org/downloads/mac-osx/ 2.安装之后,去 /Library/Frameworks/Python ...
- Linux操作系统常用命令合集——第六篇-压缩和归档操作(16个命令)
1.gzip [命令作用] 压缩和解压缩文件 gzip/guzip/zcat zcat:不显式展开的前提下查看文本文件内容 zdiff/zgrep/zless/zmore [命令语法] gzip ...
- dumpe/dumpe2fs/e2fsck
xt2/3/4文件系统备份工具 导出ext2/ext3/ext4文件系统信息 dumpe2fs e2fsck 强制检查文件系统 检查文件系统
- (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作
二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...
- 搭建自己的博客(八):使用fontawesome框架来添加图标以及美化详情页
在网页中有时候会使用到图标,自己弄图标有些麻烦所以就使用了fontawesome框架. 官网: 下载地址 我使用的fontawesome版本是5.5.0版本 1.先上变化的部分
- QoS in RoCE (zz)
QoS in RoCE 首页分类标签留言关于订阅2018-03-22 | 分类 Network | 标签 RDMA RoCE ECN PFC Overview TCP/IP协议栈满足不了现代I ...
- 模板 - 数据结构 - Treap
还有人把Treap叫做树堆的,但是常用名还是叫做Treap的比较多. 不进行任何封装的,带求和操作的,一个节点存放多个元素的最普通的Treap. #include<bits/stdc++.h&g ...