☰
std::function
2026/11/6 8:25:42 网站建设 项目流程

文章目录

    • 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;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询