首页 / 资讯中心 / 文章详情

std::function

std::function ★ FEATURED ARTICLE
文章目录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 f1fun;f1(1,2);/* std::function方式 */voidfun(intnum1,intnum2){};std::functionvoid(int,int)f2fun;f2(1,2);1.1.2 绑定普通函数voidfunc(void){std::cout__FUNCTION__endl;}std::functionvoid(void)fpfunc;fp();//调用1.1.3 绑定类的静态成员函数classObj{public:staticintfunc(inta,intb){returnab;}};std::functionint(int,int)fpObj::func;fp(1,2);1.1.3 绑定类的普通成员函数classObj{public:intfunc(inta){coutaendl;return0;}};/************************ 第二种声明方法是采用类对象的引用 *************************/std::functionint(Obj,int)fpObj::func;std::functionint(Obj,int)fpObj::func;//要传入具体对象Obj obj1;fp(obj1,2);1.1.4 绑定类函数模板classObj{public:templateclassTTfunc(T a,T b){return(T)0;}};/* 模板为int */std::functionint(Obj,int,int)fpObj::funcint;Obj obj1;fp(obj1,1,2);/* 模板为string */std::functionstring(Obj,string,string)fpObj::funcstring;Obj obj2;fp(obj2,a,b);1.1.5 绑定类共有数据成员classObj{public:intnum;Obj(inttNum):num(tNum){}};std::functionint(Obj)intpObj::num;Objobj1(100);couintp(obj1)endl;//输出为100.1.1.6 回调函数方式voidcall(string a,std::functionint(string)fp){fp(a);}intfunc(stringa){coutaendl;return0;}call(hello,func);1.1.7 使用 std::bind 与 lambda 表达式绑定lambda 表达式更直观可以捕获外部变量也能直接调用成员函数。#includefunctional#includeiostreamintadd(inta,intb){returnab;}classObj{public:intbase;Obj(inttBase):base(tBase){}intfunc(inta){returnbasea;}};intmain(){/* 1. 包装普通函数固定第一个参数 */std::functionint(int)f1[](intb){returnadd(10,b);};std::coutf1(5)std::endl;// 输出 15/* 2. 捕获外部变量 */intx100;std::functionint(int)f2[x](intb){returnadd(x,b);};std::coutf2(5)std::endl;// 输出 105/* 3. 调用类的普通成员函数 */Objobj(100);std::functionint(int)f3[obj](inta){returnobj.func(a);};std::coutf3(1)std::endl;// 输出 101/* 4. 作为回调传入 */autocallback[](inta,intb){std::coutabstd::endl;};std::functionvoid(int,int)f4callback;f4(1,2);// 输出 3return0;}
阅读完成 · 觉得有帮助?
咨询建站