C++ 回调函数

一、使用方法

1.定义一个函数指针

cpp 复制代码
typedef int (*pCallback)(int a, int b);

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

cpp 复制代码
//带参
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);
}

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

cpp 复制代码
//特定值
int twoCallback(pCallback p)
//int twoCallback(int (*pCallback)(int a, int b))
{
    return p(2,8);
    //return pCallback(2, 8);
}

4.实现回调函数

cpp 复制代码
// 回调函数
int add(int a, int b)
{
    return a+b;
}
cpp 复制代码
//第一种, 带参
int (*p)(int a, int b) = add;
p(0,6);
//第一种, 带参
oneCallback(1, 7, add);

//第二种, 特定值
twoCallback(add);

二、实例说明

std::for_each()为例

cpp 复制代码
template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
  for (; first != last; ++first) {
    f(*first);
  }
  return f;
}
cpp 复制代码
int print(int i)
{
    return i;
}
cpp 复制代码
int add(int& i)
{
    return i += 1;
}
cpp 复制代码
int sub(int& i)
{
    return i -= 1;
}
cpp 复制代码
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
cpp 复制代码
//函数指针
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);
}
cpp 复制代码
//使用
pcap_loop(handle, 0, packet_handler, NULL)
相关推荐
Larry_Yanan8 分钟前
QML学习笔记(四十八)QML与C++交互:QML中可实例化C++对象
c++·笔记·qt·学习·ui·交互
2301_8035545233 分钟前
c++调用客户端库与kafka交互
c++·kafka·交互
小年糕是糕手42 分钟前
【C/C++刷题集】二叉树算法题(一)
c语言·数据结构·c++·算法·leetcode·学习方法·改行学it
m0_748240255 小时前
Windows编程+使用C++编写EXE加壳程序
开发语言·c++·windows
LoveXming7 小时前
Chapter14—中介者模式
c++·microsoft·设计模式·中介者模式·开闭原则
杨筱毅10 小时前
【C++】【常见面试题】最简版带大小和超时限制的LRU缓存实现
c++·面试
陌路2011 小时前
C23构造函数与析构函数
开发语言·c++
_OP_CHEN11 小时前
C++进阶:(二)多态的深度解析
开发语言·c++·多态·抽象类·虚函数·多态的底层原理·多态面试题
金色熊族13 小时前
装饰器模式(c++版)
开发语言·c++·设计模式·装饰器模式
Dream it possible!13 小时前
LeetCode 面试经典 150_链表_旋转链表(64_61_C++_中等)
c++·leetcode·链表·面试