【回调函数与可调用对象】

本文介绍了C++中的回调函数及其关键点,包括定义和应用场景。接着探讨了可调用对象,如函数指针、仿函数、成员函数、Lambda表达式。详细阐述了如何使用std::function、std::bind以及lambda表达式进行函数包装和参数绑定。最后,讨论了C风格函数回调的实现方法,包括全局函数、类静态成员函数、类普通成员函数的转换策略。
摘要由CSDN通过智能技术生成


前言

在C++的开发过程中,回调作为控制业务逻辑的常用手段,应用较多。讲解了回调函数的基本概念及应用关键点、C++可调用对象的概念及对应类型举例、C++常用函数转换方式、C风格回调函数应用。


一、回调函数

1. 定义

回调函数是一个具有特定签名(参数列表和返回类型)的函数,不接受任何额外的上下文信息,可以作为参数传递到另一个函数中,并在需要时被调用。C++静态函数或非成员函数可以满足这种函数签名的要求。

2. 关键点

  • 确定的函数地址:不依赖具体的实例;
  • 特定的函数签名:不接受任何额外的上下文信息;

二、可调用对象

1.定义

可调用对象是一个更广泛的概念,它可以是函数指针、函数对象、成员函数指针、成员函数对象、Lambda表达式等。可调用对象可以像函数一样被调用,因此可以将其作为参数传递给另一个函数,以实现回调的功能。

2. 类型

  • 函数指针
  • 仿函数
  • 类对象转换为函数指针
  • 类成员函数
  • 类成员

代码示例[^1]:

void func(void){
   
	//...
}
struct Foo{
   
	void operator()(void){
   
		//...
	}
};
struct Bar{
   
	using fr_t = void(*)(void);
	static void func(void){
   
		//...
	}
	operator fr_t(void){
   
		return func;
	}
};
struct A{
   
	int a;
	void memFunc(void){
   
		//...
	}
};

int main(){
   
	//函数指针
	void (*funcPtr)(void) = &func;
	funcPtr();
	
	//仿函数
	Foo foo;
	foo();	

	//类对象转换为函数指针
	Bar bar;
	bar();

	//类成员及成员函数
	void (A::*memFuncPtr)(void) = &A::memFunc;
	int A::*memObjPtr = &A::a;
	
	A a;
	(a.*memFuncPtr)();
	(a.*memObjPtr) = 1;

	return 0;
}

三、可调用对象包装器、绑定器、lambda表达式

1. 包装器 std::function

std::function 是 C++ 标准库中的一个多态函数对象封装器,它可以用于存储、复制和调用任意可调用对象(函数、函数对象、成员函数指针、Lambda 表达式等),提供了一种通用的方式来处理函数对象,而不必关心具体的类型,像普通函数一样进行调用。

2. 绑定器 std::bind

std::bind 是 C++ 标准库中的一个函数模板,用于将可调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值