std::function 与 std::bind解决类成员函数作为回调函数的问题
1、std::function
std::function是一个模板类,其可对C++可调用的对象进行封装,比如,成员函数、静态函数等;它的基本作用是简化调用的复杂程度,归一化调用方式。
std::function<int(int, int)> int_function:声明方式为<返回值类型(参数类型1,参数类型2,...)>,其可封装任何可调用的对象,只需要将可调用的对象作为右值赋值给它:
int add_function(int a, int b)
{
return a+b;
}
std::function<int(int,int)> addFunc = add_function;
std::function怎么与类成员函数建立联系,需要通过std::bind进行建立联系。
2、std::bind
std::bind是一个基于模板的函数,它的作用是绑定并返回一个std::function对象;std::bind是模板函数,std::function是模板类,std::bind返回可直接给std::function,std::function可以包装类成员函数,其无法生成类成员函数可调用的对象,通过std::bind可以生成类成员函数可调用的对象。
std::bind绑定普通函数:std::bind(&函数名,std::placeholders::_1, ...),绑定普通成员函数时,参数1是函数名,后续是函数的参数列表,参数的书写方式是std::placeholders::_1,std::placeholders::_2,...;
std::bind类成员函数:std::bind(&类名::函数名,类对象指针,std::placeholders::_1, ...),绑定类成员函数时,参数1是类成员函数的引用,参数2是类对象指针,后续为函数参数列表。
3、示例程序
#include <iostream> #include "CommonFunctions.h" #include <functional> int add_function(int a, int b) { return a + b; } int bind_add_function(int a, int b) { return a + b; } int main() { std::function<int(int, int)> addFunc = add_function; std::function<int(int, int)> bindAddFunc = std::bind(&bind_add_function, std::placeholders::_1, std::placeholders::_2); std::shared_ptr<CommonFunctions> cf = std::make_shared<CommonFunctions>(); std::function<int(int, int)> classBindAddFunc = std::bind(&CommonFunctions::add_test, cf, std::placeholders::_1, std::placeholders::_2); std::cout <<"addFunc: "<< addFunc(5,6); std::cout << "\r\n"; std::cout <<"bindAddFunc: "<<bindAddFunc(6, 6); std::cout << "\r\n"; std::cout << "classBindAddFunc: " << classBindAddFunc(6, 7); std::cout << "\r\n"; system("pause"); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!