C++11绑定器bind及function机制( 三 )

bind可以很轻松地做到,当然如果大家知道怎么使用bind1stbind2nd绑定类成员函数,也可以评论告知我,感谢~) 。
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::_2placeholders::_1表示,_2代表二元函数对象的第二个参数22_1代表二元函数对象的第一个参数11 。这个新的可调用对象将它自己的参数作为第三个和第五个传递给fun,fun函数的第一个、第二个第四个参数分别被绑定到给定的值xyz上 。

绑定一个类的静态成员函数与绑定全局函数没有任何区别,这里不做说明,可参考文章:[ bind绑定器使用方法 ],该文章中bind详细用法中描述了对静态成员方法的使用 。
绑定一个类成员函数
绑定器绑定一个成员函数时,我们知道非静态成员函数第一个参数隐藏了一个this指针对象,所以绑定时绑定器第二个参数传递匿名类对象本身 。bind和之前的bind1stbind2nd一样,最终返回的一定是函数对象,下面的代码将一个五元函数绑定后,返回了一个三元函数对象 , 效果等同于调用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的使用方法,衍生于bind1stbind2nd,支持更多的参数绑定,关于bind函数更多的使用方法,也可参考C++Boost的说明文档:[ Boost.Bind ] 。关于bind函数绑定的过程,可参考:[ bind原理图释 ],该文章中的图片方便我们对绑定过程的理解 。
C++11 function机制C++11的function机制是C语言中函数指针的衍生,用来实现回调功能 , 我们上面的绑定器通常都是以语句执行为单位,当出了某个语句的执行后,绑定器返回的这个函数对象也就随之消失,因此需要有回调功能的function去长期保留绑定器返回的函数对象,以便在需要的时候随时通过function机制调用即可 。那有人会问,既然有函数指针,为什么还要再整出来一个function机制?这不是多此一举吗?答案肯定是:很有必要,因为function能做到的,函数指针未必能做到 , 接下来容我花点篇幅去说明为什么C++中有函数指针还需要std::function

推荐阅读