C++之回调函数使用和不使用using、typedef、function定义总结(二百五十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中......】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
更多原创,欢迎关注:Android系统攻城狮

1.前言

本篇目的:理解C++之回调函数使用与不使用using、typedef、function定义用法总结。

2.回调函数介绍

  • 1.回调函数是一种在编程中常用的设计模式,它是一种将函数作为参数传递给另一个函数的技术。这种方式允许我们在一个函数内部调用另一个函数,而这个被调用的函数是作为参数传递进来的。

  • 2.回调函数的主要用途是实现事件驱动编程和异步编程。在事件驱动编程中,当某个事件(如用户点击、网络请求完成等)发生时,会调用预先定义的回调函数来处理这个事件。在异步编程中,当某个耗时操作(如网络请求、文件读写等)完成时,会调用预先定义的回调函数来处理操作结果。

  • 3.回调函数的使用场景包括:

  • 事件处理:回调函数可以用于处理各种事件,例如鼠标点击、键盘输入、网络请求等。

  • 异步操作:回调函数可以用于异步操作,例如读取文件、发送邮件、下载文件等。

  • 数据处理:回调函数可以用于处理数据,例如对数组进行排序、过滤、映射等。

  • 插件开发:回调函数可以用于开发插件

  • 4.我们先来看看回调的英文定义:

A callback is a function that is passed as an argument to another function and is executed after its parent function has completed。

字面上的理解,回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。这个过程就叫做回调。

复制代码
回调,回调,就是回头调用的意思。主函数的事先干完,回头再调用传进来的那个函数。
简单回调函数例子
cpp 复制代码
#include <iostream>

// 定义一个回调函数
void myCallback(int x) {
    std::cout << "Called back with value " << x << std::endl;
}

// 定义一个接受回调函数作为参数的函数
void testCallback(void (*callback)(int)) {
    std::cout << "Running testCallback..." << std::endl;
    callback(42);  // 在函数内部调用回调函数
}

int main() {
    testCallback(myCallback);  // 将回调函数作为参数传递给另一个函数
    return 0;
}

3.代码实例

1.不使用任何关键字定义回调函数

在不使用任何方法的情况下,回调函数可以直接通过函数指针来定义和使用.

cpp 复制代码
#include <iostream>

void test(int a){
  printf("xxx---------->%s(), line = %d, a = %d\n",__FUNCTION__,__LINE__,a);
}

int main(){
  //定义函数指针,并赋值为回调函数
  void (*Callback)(int) = test;
  
  // 调用回调函数
  (Callback)(100);
}

2.使用typedef关键字定义回调函数

使用typedef可以为回调函数类型创建一个别名,提高代码的可读性.

cpp 复制代码
#include <iostream>

void test(int a){
  printf("xxx---------->%s(), line = %d, a = %d\n",__FUNCTION__,__LINE__,a);
}

// 定义回调函数类型的别名类型为:CallbackType
typedef void (*CallbackType)(int);  

int main(){
  // 使用别名定义函数指针并赋值为回调函数
  CallbackType Callback = test;  

  // 调用回调函数
  (Callback)(100);
}

3.使用using关键字定义回调函数

使用using关键字可以在C++11及更高版本中为回调函数类型创建别名.

cpp 复制代码
#include <iostream>

void test(int a){
  printf("xxx---------->%s(), line = %d, a = %d\n",__FUNCTION__,__LINE__,a);
}

// 定义回调函数类型的别名类型为:CallbackType
using CallbackType = void (*)(int);

int main(){
  // 使用别名定义函数指针并赋值为回调函数
  CallbackType Callback = test;

  // 调用回调函数
  (Callback)(100);
}

4.使用std::function关键字定义回调函数

使用std::function可以更灵活地定义回调函数,不仅可以接受函数指针,还可以接受函数对象、lambda表达式等。

cpp 复制代码
#include <iostream>
#include <functional>
void test(int a){
  printf("xxx---------->%s(), line = %d, a = %d\n",__FUNCTION__,__LINE__,a);
}

int main(){
  //使用std::function定义回调函数
  //v1.0: 未使用typedef和using关键字定义
  std::function<void(int)> Callback = test;
  (Callback)(100);

  
  //v2.0 :typedef
  typedef std::function<void(int)> Callback1;
  Callback1 c1 = test;
  c1(200);

  //v3.0
  using Callback2 = std::function<void(int)>;
  Callback2 c2 = test;
  c2(300);  
}
相关推荐
阿拉丁的梦1 小时前
教程1:用vscode->ptvsd-创建和调试一个UI(python)-转载官方翻译(有修正)
开发语言·python
木宇(记得热爱生活)2 小时前
一键搭建开发环境:制作bash shell脚本
开发语言·bash
Cisyam^2 小时前
Go环境搭建实战:告别Java环境配置的复杂
java·开发语言·golang
IAR Systems3 小时前
在IAR Embedded Workbench for Arm中实现Infineon TRAVEO™ T2G安全调试
开发语言·arm开发·安全·嵌入式软件开发·iar
jayzhang_3 小时前
SPARK入门
大数据·开发语言
蹦极的考拉3 小时前
网站日志里面老是出现{pboot:if((\x22file_put_co\x22.\x22ntents\x22)(\x22temp.php\x22.....
android·开发语言·php
fured3 小时前
[调试][实现][原理]用Golang实现建议断点调试器
开发语言·后端·golang
大翻哥哥4 小时前
Python地理空间数据分析:从地图绘制到智能城市应用
开发语言·python·数据分析
NPE~4 小时前
[手写系列]Go手写db — — 第二版
开发语言·数据库·golang·教程·db·手写系列
M_Reus_114 小时前
Groovy集合常用简洁语法
java·开发语言·windows