文章目录
- 1. 简介
- 1.1.1 和函数指针对比
- 1.1.2 绑定普通函数
- 1.1.3 绑定类的静态成员函数
- 1.1.3 绑定类的普通成员函数
- 1.1.4 绑定类函数模板
- 1.1.5 绑定类共有数据成员
- 1.1.6 回调函数方式
- 1.1.7 使用 std::bind 与 lambda 表达式绑定
1. 简介
函数模板
std::function<>是一种通用、多态的函数封装。
std::function<>可以存储和调用任何可调用的目标。
1.1.1 和函数指针对比
/* 函数指针方式 */typedefvoid(*callbackFun)(int,int);voidfun(intnum1,intnum2){};callbackFun f1=fun;f1(1,2);/* std::function<>方式 */voidfun(intnum1,intnum2){};std::function<void(int,int)>f2=fun;f2(1,2);1.1.2 绑定普通函数
voidfunc(void){std::cout<<__FUNCTION__<<endl;}std::function<void(void)>fp=func;fp();//调用1.1.3 绑定类的静态成员函数
classObj{public:staticintfunc(inta,intb){returna+b;}};std::function<int(int,int)>fp=Obj::func;fp(1,2);1.1.3 绑定类的普通成员函数
classObj{public:intfunc(inta){cout<<a<<endl;return0;}};/************************ 第二种声明方法是采用类对象的引用 *************************/std::function<int(Obj,int)>fp=&Obj::func;std::function<int(Obj&,int)>fp=&Obj::func;//要传入具体对象Obj obj1;fp(obj1,2);1.1.4 绑定类函数模板
classObj{public:template<classT>Tfunc(T a,T b){return(T)0;}};/* 模板为int */std::function<int(Obj&,int,int)>fp=&Obj::func<int>;Obj obj1;fp(obj1,1,2);/* 模板为string */std::function<string(Obj&,string,string)>fp=&Obj::func<string>;Obj obj2;fp(obj2,"a","b");1.1.5 绑定类共有数据成员
classObj{public:intnum;Obj(inttNum):num(tNum){}};std::function<int(Obj&)>intp=&Obj::num;Objobj1(100);cou<<intp(obj1)<<endl;//输出为100.1.1.6 回调函数方式
voidcall(string a,std::function<int(string&)>fp){fp(a);}intfunc(string&a){cout<<a<<endl;return0;}call("hello",func);1.1.7 使用 std::bind 与 lambda 表达式绑定
lambda 表达式更直观,可以捕获外部变量,也能直接调用成员函数。
#include<functional>#include<iostream>intadd(inta,intb){returna+b;}classObj{public:intbase;Obj(inttBase):base(tBase){}intfunc(inta){returnbase+a;}};intmain(){/* 1. 包装普通函数,固定第一个参数 */std::function<int(int)>f1=[](intb){returnadd(10,b);};std::cout<<f1(5)<<std::endl;// 输出 15/* 2. 捕获外部变量 */intx=100;std::function<int(int)>f2=[x](intb){returnadd(x,b);};std::cout<<f2(5)<<std::endl;// 输出 105/* 3. 调用类的普通成员函数 */Objobj(100);std::function<int(int)>f3=[&obj](inta){returnobj.func(a);};std::cout<<f3(1)<<std::endl;// 输出 101/* 4. 作为回调传入 */autocallback=[](inta,intb){std::cout<<a+b<<std::endl;};std::function<void(int,int)>f4=callback;f4(1,2);// 输出 3return0;}