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

C/C++回调函数

1.基本概念
回调函数:回调函数就是一个通过函数指针调用的函数,即把函数的指针(地址)作为参数传递给另一个函数,当这个指针在特定的事件或条件发生时被另外函数调用,用于对该事件或条件进行响应。
C语言中回调函数依赖函数指针来实现,在C++中引入了 std::function 与 std::bind 来配合进行回调函数实现。
2.C语言中回调函数使用
1)声明一个函数指针类型。
2)定义使用回调函数的函数,将函数指针类型及变量名声明作为参数传递。
3)定义符合函数指针类型的实现函数,将实现函数的指针作为参数传递给使用它的函数。
注意:实现函数的类型必须要和函数指针的类型声明一致,也就是返回值和参数表(个数、类型)要完全一致。
#include
typedef int (*Calc)(int a, int b);//声明函数指针类型
int CalcValue(int a, int b, const Calc &func) //定义调用回调函数的函数,函数指针作为参数
{
return func(a, b);}
int Add(int a, int b) {//定义函数指针类型函数
return a + b;}
int main(){
int a = 4;
int b = 6;
int c = CalcValue(a, b, Add);

std::cout << "Value: " << c << std::endl;
return EXIT_SUCCESS;}

3.C++中回调函数实现
(1)std::function:std::function 是一个模板类。作用是对C++中的可调用对象进行包装,例如普通函数、成员函数、模板函数、静态函数、lambda表达式等。它的最基本的作用是,简化调用的复杂程度,统一调用的方式。如果代码中混杂着大量普通函数、模板函数、lambda,使用 std::function 是非常有必要的。使用方法:
std::function<returnType(argType, argType,…)> func;
std::function<int(int, int)> func;
(2)std::bind:是基于模板的函数,顾明思意它的作用是绑定并返回一个 std::function 对象。作为延迟计算的思想的一种实现,作为一个调用过程当中的转发者而存在,返回一个 std::function 对象。它与 std::function 不同的是,function 是模板类,bind 是模板函数,而 bind 返回的可调用对象可以直接给 function 进行包装并保存。
int Add(int a, int b) {
return a + b;}
/* — 普通函数 — /【伪代码】std::bind(&funcName, std::placeholders::_1, …);
【常规情况】std::bind(&Add, std::placeholders::_1, std::placeholders::_2);
/
— 类成员函数 — */【伪代码】std::bind(&className::funcName, classPtr, std::placeholders::_1, …);
【常规情况】std::bind(&BrainToolBox::Add, brain, std::placeholders::_1, std::placeholders::_2);
当用作普通函数的绑定时,第一个参数是可调用对象(普通函数、lambda等),而第二个参数开始对应可调用对象的参数表。std::placeholders::_1 代表可调用对象的第一个参数,2就代表第二个参数,依此类推。当用作类成员函数的绑定时,第一个参数仍然是作为类成员的可调用对象引用,第二个参数则是对象的指针,而第三个参数开始对应可调用对象的参数表。同样使用 std::placeholders::*依次向后推。所以,与 std::function 相结合,便可以实现对类成员函数的调用:
#include
#include
#include
using namespace std;
class BrainToolBox
{
public:
int Add(int a, int b) { return a + b; };
};
int main()
{
int a = 4;
int b = 6;
std::shared_ptr brain = std::make_shared();
std::function<int(int, int)> addFunc = std::bind(&BrainToolBox::Add, brain, std::placeholders::_1, std::placeholders::_2);
int c = addFunc(a, b);
std::cout << "c Value: " << c << std::endl;
return EXIT_SUCCESS;
}


http://www.kler.cn/a/6373.html

相关文章:

  • Debian 12 安装配置 fail2ban 保护 SSH 访问
  • 怎么实现柔性动态自适应IVR功能
  • android EditText密码自动填充适配
  • MFC用List Control 和Picture控件实现界面切换效果
  • Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘
  • c++--------c++概念
  • C++ 每日一练
  • ChatGPT全球大封号!数10万企业停摆:第一批玩AI的人,被AI给玩了
  • Atomic包
  • 【数据结构】线性表(顺序存储和链式存储)两种方法,细节满满,保你学会
  • Compose(?/N) - 微件
  • 数据字典和数据字典视图
  • node Mongodb 修改数据库返回的值
  • HulaCWMS呼啦企业网站管理系统 v3.0.4
  • 洛谷 P1135 奇怪的电梯 题解
  • C 数据类型
  • vscode设置选中代码自定义高亮颜色
  • 4个令人惊艳的ChatGPT项目,开源了!AIGC也太猛了...
  • 蓝桥杯-作物杂交(C++)
  • 【vue2.0后台项目之登陆】01登陆开发流程分析
  • Codeforces div 863C
  • C++ unordered_map容器所有的函数使用方法
  • 【Ruby学习笔记】6.Ruby 注释及判断
  • 剑指 Offer 56 - I. 数组中数字出现的次数
  • Android物理按键事件处理
  • springboot 数据库应用