zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Python环境搭建
    接口测试工具Jmeter
    接口测试工具postman
    fiddler -- 一个强大的抓包工具
    Pychram中使用reduce()函数报错:Unresolved reference 'reduce'
    Mac下用命令行获取苹果手机的UDID
    python 的 lambda使用笔记
    appium报错:An unknown server-side error occurred while processing the command. Original error: Could not proxy command to remote server. Original error: Error: read ECONNRESET
    Pycharm中使用from appium import webdriver时报错:ModuleNotFoundError: No module named 'appium'
    如何升级pip3
  • 原文地址:https://www.cnblogs.com/qrlozte/p/4453786.html
Copyright © 2011-2022 走看看