std::function与std::bind 函数指针
2014-05-04 00:00
411 查看
摘要: function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。
std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。
function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。
std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。
[cpp] view plaincopy
#include <iostream>
#include <functional>
using namespace std;
typedef std::function<void ()> fp;
void g_fun()
{
cout<<"g_fun()"<<endl;
}
class A
{
public:
static void A_fun_static()
{
cout<<"A_fun_static()"<<endl;
}
void A_fun()
{
cout<<"A_fun()"<<endl;
}
void A_fun_int(int i)
{
cout<<"A_fun_int() "<<i<<endl;
}
//非静态类成员,因为含有this指针,所以需要使用bind
void init()
{
fp fp1=std::bind(&A::A_fun,this);
fp1();
}
void init2()
{
typedef std::function<void (int)> fpi;
//对于参数要使用占位符 std::placeholders::_1
fpi f=std::bind(&A::A_fun_int,this,std::placeholders::_1);
f(5);
}
};
int main()
{
//绑定到全局函数
fp f2=fp(&g_fun);
f2();
//绑定到类静态成员函数
fp f1=fp(&A::A_fun_static);
f1();
A().init();
A().init2();
return 0;
}
同时,std::bind绑定到虚函数时会表现出多态行为。
[cpp] view plaincopy
#include <iostream>
#include <functional>
using namespace std;
typedef std::function<void ()> fp;
class A
{
public:
virtual void f()
{
cout<<"A::f()"<<endl;
}
void init()
{
//std::bind可以表现出多态行为
fp f=std::bind(&A::f,this);
f();
}
};
class B:public A
{
public:
virtual void f()
{
cout<<"B::f()"<<endl;
}
};
int main()
{
A* pa=new B;
pa->init();
return 0;
}
std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。
function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。
std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。
[cpp] view plaincopy
#include <iostream>
#include <functional>
using namespace std;
typedef std::function<void ()> fp;
void g_fun()
{
cout<<"g_fun()"<<endl;
}
class A
{
public:
static void A_fun_static()
{
cout<<"A_fun_static()"<<endl;
}
void A_fun()
{
cout<<"A_fun()"<<endl;
}
void A_fun_int(int i)
{
cout<<"A_fun_int() "<<i<<endl;
}
//非静态类成员,因为含有this指针,所以需要使用bind
void init()
{
fp fp1=std::bind(&A::A_fun,this);
fp1();
}
void init2()
{
typedef std::function<void (int)> fpi;
//对于参数要使用占位符 std::placeholders::_1
fpi f=std::bind(&A::A_fun_int,this,std::placeholders::_1);
f(5);
}
};
int main()
{
//绑定到全局函数
fp f2=fp(&g_fun);
f2();
//绑定到类静态成员函数
fp f1=fp(&A::A_fun_static);
f1();
A().init();
A().init2();
return 0;
}
同时,std::bind绑定到虚函数时会表现出多态行为。
[cpp] view plaincopy
#include <iostream>
#include <functional>
using namespace std;
typedef std::function<void ()> fp;
class A
{
public:
virtual void f()
{
cout<<"A::f()"<<endl;
}
void init()
{
//std::bind可以表现出多态行为
fp f=std::bind(&A::f,this);
f();
}
};
class B:public A
{
public:
virtual void f()
{
cout<<"B::f()"<<endl;
}
};
int main()
{
A* pa=new B;
pa->init();
return 0;
}
相关文章推荐
- C/C++编译过程理解
- c/c++宏的使用总结
- do...while(0)的妙用
- C++中static的全部用法
- C++中的typeid关键字
- 关于C++中函数指针的使用
- struct初始化及构造函数与class区别
- C++语言中const的用法
- 算法竞赛入门经典 例3-2蛇形填数
- C++函数调用过程深入分析
- android 制作 ppm开机图
- joomla
- 做事先做人(梁万里)——书摘
- ProgressDialog用法
- Android之SimpleAdapter简单实例和SimpleAdapter参数说明
- Adapter getView
- Android Socket通信
- python syslog
- 你不得不知道的移动互联网思维法则
- 单链表就地逆置以及链表合并