bind
可以很轻松地做到,当然如果大家知道怎么使用bind1st
和bind2nd
绑定类成员函数,也可以评论告知我,感谢~) 。
C++11 bind通用绑定器(函数适配器)我们可将bind
函数看作是一个通用的函数适配器,它接受一个可调用函数对象,生成一个新的可调用函数对象来“适应”原对象的参数列表 。bind相比于bind1st和bind2nd,实现了“动态生成新的函数”的功能 。简言之,可通过bind
函数修改原函数并生成一个可以被调用的对象,类似于函数的重载,但是我们又不需要去重新写一个函数,用bind
函数就可以实现 。相信在上面讲bind1st和bind2nd时 , 大家对这些关于绑定器(函数适配器)的概念已经有所认知 , 我们直接看看如何用的吧 。
绑定一个普通函数和函数指针
#include <iostream>#include <functional>using namespace std;using namespace placeholders;int fun(int a, int b, int c, int d, int e) {return a + b - c + d - e;}int main() {int x = 1, y = 2, z = 3;auto g = bind(fun, x, y, _2, z, _1); //第一个参数&可省略 但最好写成&funcout << g(11, 22) << endl; // fun(1, 2, 22, 3, 11) => 1+2-22+3-11// cout << bind(fun, x, y, _2, z, _1)(11, 22) << endl; //等价}
g
是有两个参数的二元函数对象,其两个参数分别用占位符placeholders::_2
和placeholders::_1
表示,_2
代表二元函数对象的第二个参数22
,_1
代表二元函数对象的第一个参数11
。这个新的可调用对象将它自己的参数作为第三个和第五个传递给fun,fun函数的第一个、第二个第四个参数分别被绑定到给定的值x
、y
、z
上 。
绑定一个类的静态成员函数与绑定全局函数没有任何区别,这里不做说明,可参考文章:[ bind绑定器使用方法 ],该文章中bind详细用法中描述了对静态成员方法的使用 。绑定一个类成员函数
绑定器绑定一个成员函数时,我们知道非静态成员函数第一个参数隐藏了一个
this
指针对象,所以绑定时绑定器第二个参数传递匿名类对象本身 。bind
和之前的bind1st
、bind2nd
一样,最终返回的一定是函数对象,下面的代码将一个五元函数绑定后,返回了一个三元函数对象 , 效果等同于调用f.operator()(10, 6, 7)
。#include <iostream>#include <functional>using namespace std;using namespace placeholders;class Test {public:int func(int a, int b, int c, int d, int e) { return a + b - c + d - e; }};int main() {auto f = bind(&Test::func, Test(), _1, 12, _3, 5, _2);cout << f(10, 6, 7) << endl; //输出:10+12-7+5-6 = 14cout << f.operator()(10, 6, 7) << endl;}
作为类成员函数,需要注意的一点是,如果是非静态的成员函数 , 它会存在一个默认的this
指针,静态的成员函数则不存在this
指针,所以在将其作为bind
函数的参数时,需要注意使用this
指针作为其中一个参数 , 当使用静态成员函数作为参数时,其用法和全局函数类似,当参数为类内非静态成员函数时,第一个参数必须使用&
符号 。注:成为成员函数时,第一个参数之所以必须使用以上就是&
符号,这部分原因可参考:[ C++中普通函数指针与类成员函数指针的异同 ],文章中有说明具体原因 。
C++11 bind
的使用方法,衍生于bind1st
、bind2nd
,支持更多的参数绑定,关于bind
函数更多的使用方法,也可参考C++Boost
的说明文档:[ Boost.Bind ] 。关于bind
函数绑定的过程,可参考:[ bind原理图释 ],该文章中的图片方便我们对绑定过程的理解 。C++11 function机制C++11的function机制是C语言中函数指针的衍生,用来实现回调功能 , 我们上面的绑定器通常都是以语句执行为单位,当出了某个语句的执行后,绑定器返回的这个函数对象也就随之消失,因此需要有回调功能的function去长期保留绑定器返回的函数对象,以便在需要的时候随时通过function机制调用即可 。那有人会问,既然有函数指针,为什么还要再整出来一个function机制?这不是多此一举吗?答案肯定是:很有必要,因为function能做到的,函数指针未必能做到 , 接下来容我花点篇幅去说明为什么C++中有函数指针还需要
std::function
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- .net core Blazor+自定义日志提供器实现实时日志查看器
- 小样本利器4. 正则化+数据增强 Mixup Family代码实现
- 学习ASP.NET Core Blazor编程系列九——服务器端校验
- nginx 客户端返回499的错误码
- 三、Go环境安装
- 100版本dnf如何给武器镶嵌徽章(dnf如何在装备上镶嵌徽章)
- oppoa93参数配置详情_oppoa93参数配置详情处理器
- 崩坏3武器索尔之锤强度如何
- 天玑1100相当于骁龙多少处理器_天玑1100相当于骁龙什么水平
- 我的世界暗物质武器怎么做(我的世界暗物质套怎么合成)