• C++ 回调函数


    一、使用方法

    1.定义一个函数指针

    typedef int (*pCallback)(int a, int b);
    
    • 1

    2.定义一个带参的回调函数(注释部分是普通回调函数,不用定义第一步里的函数指针)

    //带参
    int oneCallback(int a, int b, pCallback p)
    //int oneCallback(int a, int b, int (*pCallback)(int a, int b))
    {
        return p(a, b);
        //return pCallback(a, b);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.不带参或者是固定值或使用全局变量的使用(注释部分同上解释)

    //特定值
    int twoCallback(pCallback p)
    //int twoCallback(int (*pCallback)(int a, int b))
    {
        return p(2,8);
        //return pCallback(2, 8);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.实现回调函数

    // 回调函数
    int add(int a, int b)
    {
        return a+b;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    //第一种, 带参
    int (*p)(int a, int b) = add;
    p(0,6);
    //第一种, 带参
    oneCallback(1, 7, add);
    
    //第二种, 特定值
    twoCallback(add);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    二、实例说明

    std::for_each()为例

    template<class InputIt, class UnaryFunction>
    UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
    {
      for (; first != last; ++first) {
        f(*first);
      }
      return f;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    int print(int i)
    {
        return i;
    }
    
    • 1
    • 2
    • 3
    • 4
    int add(int& i)
    {
        return i += 1;
    }
    
    • 1
    • 2
    • 3
    • 4
    int sub(int& i)
    {
        return i -= 1;
    }
    
    • 1
    • 2
    • 3
    • 4
    std::vector<int> vec{0,1,2,3,4,5,6};
    std::for_each(vec.begin(), vec.end(), print); //return _0_1_2_3_4_5_6
    std::for_each(vec.begin(), vec.end(), add);
    std::for_each(vec.begin(), vec.end(), print); //return _1_2_3_4_5_6_7
    std::for_each(vec.begin(), vec.end(), sub);
    std::for_each(vec.begin(), vec.end(), print); //return _-1_0_1_2_3_4_5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    //函数指针
    typedef void (*pcap_handler)(u_char * user, const struct pcap_pkthdr *header, const u_char *pkt_data);
    
    //调用回调函数(处理数据并判断是否调用回调函数)
    int	pcap_loop(pcap_t * handler, int cnt, pcap_handler callBack, u_char * user);
    
    /* 回调函数,用来处理数据包 */
    void packet_handler(u_char *user, const struct pcap_pkthdr *header, const u_char *pkt_data)
    {
        Q_UNUSED(dumpfile);
        _data_ data;
        data.tv_sec = header->ts.tv_sec;
        data.tv_usec = header->ts.tv_usec;
        data.len = header->len;
        //data.pkt_data = pkt_data;
        data.pkt_data = (const u_char*)malloc(data.len+1);
        memcpy((void*)data.pkt_data, pkt_data, data.len);
    
        all_data_vec.push_back(data);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    //使用
    pcap_loop(handle, 0, packet_handler, NULL)
    
    • 1
    • 2
  • 相关阅读:
    java面试题(17):链表两数相加
    在vue项目中下载swiper出现:Do not use ‘new’ for side effects报错问题
    Solidity 小白教程:16. 函数重载
    提升群辉AudioStation音乐体验,实现公网音乐播放
    Prometheus监控系统
    Calico 网络故障排查 calico/node is not ready: BIRD is not ready(指定Calico匹配网桥规则)
    Chrome浏览器关闭左上角搜索标签页的解决办法
    数据结构详细笔记——串
    如何在小程序的个人中心页面进行装修
    Codeforces Round #804 (Div. 2)(A~D)
  • 原文地址:https://blog.csdn.net/qq_44084616/article/details/132810498