function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。
std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。
- #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;
- }
-
-
- void init()
- {
- fp fp1=std::bind(&A::A_fun,this);
- fp1();
- }
-
- void init2()
- {
- typedef std::function<void (int)> fpi;
-
- 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绑定到虚函数时会表现出多态行为。
- #include <iostream>
- #include <functional>
- using namespace std;
-
- typedef std::function<void ()> fp;
-
- class A
- {
- public:
- virtual void f()
- {
- cout<<"A::f()"<<endl;
- }
-
- void init()
- {
-
- 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;
- }
写在最后:如果要实现类似网络消息派发功能。可以预先使用 HashMap 保存好 classnamekey和 类对象的映射关系。等网络消息过来后包括(classnamekey,funnamekey),通过classnamekey找到类对象。然后转调类对象的固定方法,(在类对象初始化时使用 HashMap保存好funnamekey 和 类内部函数的映射关系) ,在类对象固定方法内根据 funnamekey 找到对应类的内部函数,然后可以调用类对象的函数。