C Pointer-to-Function 与 C++ Pointer-to-MemberFunction 的区别

在看APUE Figure1.10的时候发现signal(SIGINT, sig_int)这里的sig_int直接用的函数名,但是看Thinking-in-C++ Vol.2的时候发现mem_fun(&Shape::draw)却对函数名进行了取地址操作,感觉有疑问就查了一下资料,下面的代码可以展示出这两者之间的一些区别

参考资料:

http://stackoverflow.com/questions/3050805/pointer-to-const-member-function-typedef

http://www.cplusplus.com/reference/functional/mem_fun1_t/

http://www.cnblogs.com/taobataoma/archive/2007/08/30/875743.html

http://www.cplusplus.com/reference/functional/mem_fun/

代码:

 1 #include <functional>

 2 #include <iostream>

 3 #include <algorithm>

 4 

 5 

 6 using namespace std;

 7 

 8 void my(int arg);

 9 

10 class MyClass

11 {

12 public:

13     void my(int arg) { cout << arg << endl; }

14 };

15 

16 // 方法1,2

17 

18 typedef void func_ptr(int);                 // func_ptr与func_ptr2本质是一样的,选择哪种定义方式看你的喜好

19 typedef void (*func_ptr2)(int);                // 参考:http://www.cnblogs.com/qrlozte/p/4439002.html

20 void dosomething_one(func_ptr ptr);

21 void dosomething_two(func_ptr2 ptr);

22 

23 // 方法3,4,5

24 

25 void dosomething_three(void (MyClass::*my_ptr)(int)); 

26 

27 typedef void FuncType(int);

28 typedef FuncType MyClass::*MyClassFuncType;

29 

30 typedef void (MyClass::*MemberFuncType)(int);

31 

32 void dosomething_four(MyClassFuncType ptr);

33 

34 void dosomething_five(MemberFuncType ptr);

35 

36  

37 

38 int main() {

39     /*

40         方法1,2本质是一样的

41         方法3,4,5本质也是一样的

42     */

43     dosomething_one(my);

44     dosomething_two(my);

45     dosomething_three(&MyClass::my);

46     dosomething_four(&MyClass::my);

47     dosomething_five(&MyClass::my);

48     return 0;

49 } ///:~

50 

51 void my(int arg)

52 {

53     cout << arg << endl;

54 }

55 

56 

57 void dosomething_one(func_ptr ptr)

58 {

59     ptr(1);

60 }

61 

62 void dosomething_two(func_ptr ptr)

63 {

64     ptr(2);

65 }

66 

67 void dosomething_three(void (MyClass::*my_ptr)(int))

68 {

69     MyClass *obj = new MyClass;

70     (obj->*my_ptr)(3);

71     delete obj;

72 }

73 

74 void dosomething_four(MyClassFuncType ptr)

75 {

76     MyClass *obj = new MyClass;

77     (obj->*ptr)(4);

78     delete obj;

79 }

80 

81 void dosomething_five(MemberFuncType ptr)

82 {

83     MyClass *obj = new MyClass;

84     (obj->*ptr)(5);

85     delete obj;

86 }

 

你可能感兴趣的:(function)