欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++ 仿函数代码实例

程序员文章站 2023-03-27 23:14:23
//--------------------------------------------------- 1 #include < functional> &nbs...

//---------------------------------------------------

1 #include < functional>  

2    

3 int Func(int x, int y);  

4 auto bf1 = std::bind(Func, 10, std::placeholders::_1);  

5 bf1(20); ///< same as Func(10, 20)  

6    

7 class A  

8 {  

9 public:  

10     int Func(int x, int y);  

11 };  

12    

13 A a;  

14 auto bf2 = std::bind(&A::Func, a, std::placeholders::_1, std::placeholders::_2);  

15 bf2(10, 20); ///< same as a.Func(10, 20)  

16    

17 std::function< int(int)> bf3 = std::bind(&A::Func, a, std::placeholders::_1, 100);  

18 bf3(10); ///< same as a.Func(10, 100)

19 

//-----------------------------------------------------------

std::function与std::bind 函数指针

function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时。

std::function可以绑定到全局函数/类静态成员函数(类静态成员函数与全局函数没有区别),如果要绑定到类的非静态成员函数,则需要使用std::bind。

[cpp] view plaincopy

1 #include <iostream>  

2 #include <functional>  

3 using namespace std;  

4   

5 typedef std::function<void ()> fp;  

6 void g_fun()  

7 {  

8     cout<<"g_fun()"<<endl;  

9 }  

10 class A  

11 {  

12 public:  

13     static void A_fun_static()  

14     {  

15         cout<<"A_fun_static()"<<endl;  

16     }  

17     void A_fun()  

18     {  

19         cout<<"A_fun()"<<endl;  

20     }  

21     void A_fun_int(int i)  

22     {  

23         cout<<"A_fun_int() "<<i<<endl;  

24     }  

25   

26     //非静态类成员,因为含有this指针,所以需要使用bind  

27     void init()  

28     {  

29         fp fp1=std::bind(&A::A_fun,this);  

30         fp1();  

31     }  

32   

33     void init2()  

34     {  

35         typedef std::function<void (int)> fpi;  

36         //对于参数要使用占位符 std::placeholders::_1  

37         fpi f=std::bind(&A::A_fun_int,this,std::placeholders::_1);  

38         f(5);  

39     }  

40 };  

41 int main()  

42 {  

43     //绑定到全局函数  

44     fp f2=fp(&g_fun);  

45     f2();  

46   

47     //绑定到类静态成员函数  

48     fp f1=fp(&A::A_fun_static);  

49     f1();  

50   

51     A().init();  

52     A().init2();  

53     return 0;  

54 }  

同时,std::bind绑定到虚函数时会表现出多态行为。

[cpp] view plaincopy

55 #include <iostream>  

56 #include <functional>  

57 using namespace std;  

58   

59 typedef std::function<void ()> fp;  

60   

61 class A  

62 {  

63 public:  

64     virtual void f()  

65     {  

66         cout<<"A::f()"<<endl;  

67     }  

68   

69     void init()  

70     {  

71         //std::bind可以表现出多态行为  

72         fp f=std::bind(&A::f,this);  

73         f();  

74     }  

75 };  

76 class B:public A  

77 {  

78 public:  

79     virtual void f()  

80     {  

81         cout<<"B::f()"<<endl;  

82     }  

83 };  

84 int main()  

85 {  

86     A* pa=new B;  

87     pa->init();  

88   

89     return 0;  

90 }  

20