1.概述
function是C++11中对于函数,函数指针,函数对象,lambda表达式等可调用函数的汇总,bind函数将一个普通函数或者成员函数转化为可给function对象赋值的对象,使用这两个函数可以实现C++通用意义上的回调和委托机制.
2.bind 函数返回的函数对象赋值给function对象时的要求是,返回值一定要相同,参数类型需要相同,参数个数需要小于等于function函数对象的参数个数.
#include <iostream>
#include <functional>
#include <string>
using namespace std;
class Foo{
public:
typedef function<void(int)> Callback;
void methodA(){
cout<<"foo methoda"<<endl;
}
void methodB(){
cout<<"foo methodB"<<endl;
}
void methodString(const string& str){
cout<<"foo method string"<<endl;
}
void methodMul(int x,double y,const string& str){
cout<<x<<y<<str<<endl;
}
void start(){
cb(4);
}
void setCallback(const Callback& c){
cb = c;
}
private:
Callback cb;
};
class Bar{
public:
void methodB(int x,int y){
cout<<"bar method b"<<endl;
}
};
int main(){
Bar bar;
Foo::Callback f = std::bind(&Bar::methodB,&bar,std::placeholders::_1,std::placeholders::_2);
Foo foo;
foo.setCallback(f);
foo.start();
}
编译时报错
此时bind返回的函数有两个参数,而f只能有一个参数.
#include <iostream>
#include <functional>
#include <string>
using namespace std;
class Foo{
public:
typedef function<void(int)> Callback;
void methodA(){
cout<<"foo methoda"<<endl;
}
void methodB(){
cout<<"foo methodB"<<endl;
}
void methodString(const string& str){
cout<<"foo method string"<<endl;
}
void methodMul(int x,double y,const string& str){
cout<<x<<y<<str<<endl;
}
void start(){
cb(4);
}
void setCallback(const Callback& c){
cb = c;
}
private:
Callback cb;
};
class Bar{
public:
void methodB(int x,int y){
cout<<"bar method b"<<endl;
}
};
int main(){
Bar bar;
Foo::Callback f = std::bind(&Bar::methodB,&bar,1,2);
Foo foo;
foo.setCallback(f);
foo.start();
}
此时编译通过,但此时bind返回的函数其实是一个不需要参数的函数对象,因此说明只能允许参数个数少的函数对象可以赋值给参数个数较多的函数对象,前提是参数类型都匹配.
至于为什么这样设计,将参数少的绑定到参数多的函数中,那么在回调该函数的时候,只需要将不需要的参数丢掉,即可. 如果相反的话,那么会因为需要的参数不够而不能够回调..
应该是这么回事.
结论是参数少的可以绑定到参数多的上面.