使用std::function和std::bind实现函数回调
std::function
作为c++11新增的内容,std::function的实例可以对任何可调用对象实体进行存储、复制、和调用。
其实就是一个对所有可调用对象的封装,通过一套方法调用一切。
可调用对象包括:
- 普通函数
- 函数指针
- Lambda表达式
- 仿函数对象
- 类静态函数
- 类成员函数
- 其他函数对象
**注意:**std::function的实例将可调用对象封装成一个新的对象,所以不能判断两个std::function是否是同一个函数的封装。
std::bind
std::bind与std::function不同,std::function是一个类模板,而std::bind则是一个函数,它可以将可调用对象及其参数进行封装,也可以对参数顺序进行重新组织,甚至改变其参数个数。
code
#include <iostream>
#include <functional>
extern "C" {
int func1(int a)
{
std::cout << __FUNCDNAME__ << std::endl;
return a;
}
int func2(int a, int b)
{
std::cout << __FUNCDNAME__ << std::endl;
return a + b;
}
int callFunc(std::function<int(int)> f, int a)
{
std::cout << __FUNCDNAME__ << std::endl;
return f(a);
}
int main()
{
std::function<int(int)> f1 = func1;
std::cout << f1(1) << std::endl;
std::function<int(int, int)> f2 = func2;
std::cout << f2(1, 2) << std::endl;
std::function<int(int)> f3 = std::bind(func2, std::placeholders::_1, 2);
std::cout << f3(1) << std::endl;
std::cout << callFunc(func1, 2) << std::endl;
std::cout << callFunc(f3, 2) << std::endl;
std::cin.ignore();
return 0;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端