当前位置: 首页 > news >正文

C++ 回调函数

一、使用方法

1.定义一个函数指针

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

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);
}

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

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

4.实现回调函数

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

二、实例说明

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;
}
int print(int i)
{return i;
}
int add(int& i)
{return i += 1;
}
int sub(int& i)
{return i -= 1;
}
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
//函数指针
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);
}
//使用
pcap_loop(handle, 0, packet_handler, NULL)
http://www.lryc.cn/news/164204.html

相关文章:

  • xilinx FPGA IOB约束使用以及注意事项
  • 如何统计iOS产品不同渠道的下载量?
  • 大模型学习
  • Redis原理:IntSet
  • 【已解决】Splunk 8.2.X 升级ES 后红色报警
  • 香橙派使用外设驱动库wiringOP 配合定时器来驱动舵机
  • C++学习笔记--函数重载(2)
  • 代码随想录算法训练营Day56 || ● 583. 两个字符串的删除操作 ● 72. 编辑距离
  • chrome_elf.dll丢失怎么办?修复chrome_elf.dll文件的方法
  • 代码随想录32|738.单调递增的数字,968.监控二叉树,56. 合并区间
  • BIO NIO AIO演变
  • JVM GC垃圾回收
  • 【数据结构】队列知识点总结--定义;基本操作;队列的顺序实现;链式存储;双端队列;循环队列
  • 嵌入式学习之链表
  • 静态代理和动态代理笔记
  • [SM6225][Android13]user版本默认允许root和remount
  • pyinstaller打包exe,使用wexpect的问题
  • OpenCV(三十三):计算轮廓面积与轮廓长度
  • 9.11作业
  • AI伦理与未来社会:探讨人工智能的道德挑战与机会
  • Android窗口层级(Window Type)分析
  • 微信小程序基础加强总结
  • 【JAVA - List】差集removeAll() 四种方法实现与优化
  • sql注入基本概念
  • AIGC系列:1.chatgpt可以用来做哪些事情?
  • End-to-End Object Detection with Transformers(论文解析)
  • 生成多样、真实的评论(2019 IEEE International Conference on Big Data )
  • 项目中应该使用nginx还是拦截器来封禁IP
  • SMB 协议详解之-NTLM身份认证
  • day34 Set