《C++11:function和bind》
《C11function和bind》[作者的个人Gitee](友人A (friend-a188881041351) - Gitee.com)每日一言:“**存在是一场无尽的对话我们既是提问者也是答案。”一、functiontemplate class T class function; // undefined template class Ret, class... Args class functionRet(Args...);std::function是一个类模板也是一个包装器。std::function的实例对象可以包装存储其他的可调用对象包括函数指针、仿函数、lambda、bind表达式等存储的可调用对象被称为std::function的目标。若std::function不含目标则称它为空。调用空std::function的目标将抛出std::bad_function_call异常。以上代码是function原型他被定义在头文件中。官方链接function - C Reference。function返回值,(参数1参数2参数3…)函数指针、仿函数、lambda等可调用对象的类型各不相同std::function的优势就统一类型对它们进行统一的包装这样在很多地方就方便声明可调用对象的类型。代码样例一#include iostream #include functional using namespace std; int f(int a,int b) { return a b; } struct Functor { public: int operator()(int a,int b) { return a b; } }; int main() { //包装各种可调用对象 functionint(int,int) f1 f;//函数指针 functionint(int,int) f2 Functor();//函数对象 functionint(int,int) f3 [](int a,int b){return a b;};//lambda cout f1(1,2) endl; cout f2(1,2) endl; cout f3(1,2) endl; return 0; }输出结果如下代码样例二#include iostream #include functional using namespace std; class Plus { public: Plus(int n 10) :_n(n) {} static int Plusi(int a,int b) { return a b; } double Plusd(int a,int b) { return (a b) * _n; } private: int _n; }; int main() { //包装静态成员函数 functionint(int,int) f4 Plus::Plusi;//静态成员函数需要指明类域最好加上也可以不加 cout f4(1,2) endl; //包装普通成员函数 //普通成员函数还有一个隐藏的this指针参数所以绑定时传对象或者传对象的指针过去都可以 functiondouble(Plus*,double,double) f5 Plus::Plusd;//传指针 Plus pd; cout f5(pd,1.1,2.2) endl; functiondouble(Plus,double,double) f6 Plus::Plusd;//传对象 cout f6(pd,1.1,2.2) endl; functiondouble(Plus,double,double) f7 Plus::Plusd;//传右值引用 cout f7(move(pd),1.1,2.2) endl; cout f7(Plus(),1.1,2.2) endl; return 0; }输出结果如下LeetCode逆波兰表达式求值题目优化题目链接LCR 036. 逆波兰表达式求值 - 力扣LeetCodeclass Solution { public: int evalRPN(vectorstring tokens) { stackint st; for(auto str: tokens) { if(str || str - || str * || str /) { int right st.top(); st.pop(); int left st.top(); st.pop(); switch(str[0]) { case : st.push(left right); break; case -: st.push(left - right); break; case *: st.push(left * right); break; case /: st.push(left / right); break; } } else { st.push(stoi((str))); } } return st.top(); } };我们一般的写法就是这样但是我们学了function之后就可以进行优化了我们使用map映射是string和function的方式实现。这种方式的最大好处就是方便扩展假设还有其他运算我们只需要增加map之中的映射即可。优化后的代码如下class Solution { public: int evalRPN(vectorstring tokens) { stackint st; mapstring,functionint(int,int) opFuncMap { {,[](int a,int b){return a b;}}, {-,[](int a,int b){return a - b;}}, {*,[](int a,int b){return a * b;}}, {/,[](int a,int b){return a / b;}} }; for(auto str: tokens) { if(opFuncMap.count(str)) { int right st.top(); st.pop(); int left st.top(); st.pop(); int ret opFuncMap[str](left,right); st.push(ret); } else { st.push(stoi((str))); } } return st.top(); } };二、bindtemplate class Fn, class... Args bind (Fn fn, Args... args); template class Ret, class Fn, class... Args bind (Fn fn, Args... args);bind是一个函数模板他也是一个可调用对象的包装器可以把它看作一个函数适配器对接受的fn可调用对象进行处理后返回一个可调用对象。bind可以用来调整参数个数和参数顺序。bind也在这个头文件中。调用bind的一般形式auto newVallable bind(callable,arg_list);其中newcallable本身就是一个可调用对象arg_list是一个用逗号分隔的参数列表对应给定的callable的参数。当我们调用newcallable时newcallable会调用callable并传给它arg_list中的参数。arg_list中的参数可能包含形如_n的名字其中n是一个整数表示newcallable的参数他们占据了传递给newcallable的参数的位置。数值n表示生成的可调用对象中参数的位置_1为第一个参数_2为第二个参数_3是第三个参数以此类推。而_1、_2…这些占位符都被放在placeholders的一个命名空间中。代码样例一#include iostream #include functional using namespace std; using namespace placeholders; int Sub(int a,int b) { return (a - b) * 10; } int SubX(int a,int b,int c) { return (a - b - c) * 10; } class Plus { public: Plus(int n 10) :_n(n) {} static int Plusi(int a,int b) { return a b; } double Plusd(int a,int b) { return (a b) * _n; } private: int _n; }; int main() { //bind本质返回的是一个仿函数对象 //调整参数顺序_1代表第一个实参_2代表第二个实参 auto sub1 bind(Sub,_1,_2); cout sub1(10,5) endl; auto sub2 bind(Sub,_2,_1); cout sub2(10,5) endl; //调整参数个数 auto sub3 bind(Sub,10,_1); cout sub3(5) endl; auto sub4 bind(Sub,_1,100); cout sub4(5) endl; //分别绑死第1、2、3个参数 auto sub5 bind(SubX,100,_1,_2); cout sub5(5,1) endl; auto sub6 bind(SubX,_1,100,_2); cout sub6(5,1) endl; auto sub7 bind(SubX,_1,_2,100); cout sub7(5,1) endl; //成员函数第一个隐式参数绑死就不需要每次都传this了 //普通情况 functiondouble(Plus,double,double) f8 Plus::Plusd; Plus pd_; cout f8(move(pd_),1.1,2.2) endl; cout f8(Plus(),1.1,2.2) endl; //使用bind进行绑定 functiondouble(double,double) f9 bind(Plus::Plusd,Plus(),_1,_2); cout f9(1.1,2.2) endl; return 0; }输出结果如下;代码样例二#include iostream #include functional using namespace std; using namespace placeholders; int main() { // 计算复利的lambda auto func1 [](double rate, double money, int year)-double { double ret money; for (int i 0; i year; i) { ret ret * rate; } return ret - money; }; // 绑死⼀些参数实现出⽀持不同年华利率不同⾦额和不同年份计算出复利的结算利息 functiondouble(double) func3_1_5 bind(func1, 0.015, _1, 3); functiondouble(double) func5_1_5 bind(func1, 0.015, _1, 5); functiondouble(double) func10_2_5 bind(func1, 0.025, _1, 10); functiondouble(double) func20_3_5 bind(func1, 0.035, _1, 30); cout func3_1_5(1000000) endl; cout func5_1_5(1000000) endl; cout func10_2_5(1000000) endl; cout func20_3_5(1000000) endl; return 0; }输出结果如下bind(func1, 0.025, _1, 10);functiondouble(double) func20_3_5 bind(func1, 0.035, _1, 30);cout func3_1_5(1000000) endl; cout func5_1_5(1000000) endl; cout func10_2_5(1000000) endl; cout func20_3_5(1000000) endl; return 0;}输出结果如下 [外链图片转存中...(img-YFqja8rM-1773052460186)] --- 如有错误恳请指正

相关新闻

CSDN程序员生存图鉴:用真实代码片段+踩坑截图,还原一线开发者在CSDN发帖、答疑、涨粉的全链路

CSDN程序员生存图鉴:用真实代码片段+踩坑截图,还原一线开发者在CSDN发帖、答疑、涨粉的全链路

在CSDN这个中国最大的开发者社区里,每天有无数程序员在这里写下他们的困惑、经验和成长。有人在这里从零粉丝做到五万大V,有人在深夜两点为了一句“求大神帮忙”回复上千字的技术解析,也有人只是默默收藏了十几篇从未看完的教程。这不是一篇鸡…

2026/5/17 11:05:01 阅读更多 →
【游戏常用运行库合集】全面解决修复电脑缺失VC++运行库、dll文件等组件缺失的问题| GRLPackage最新版!

【游戏常用运行库合集】全面解决修复电脑缺失VC++运行库、dll文件等组件缺失的问题| GRLPackage最新版!

说在前面的话 遇到新装系统或者游戏打不开,甚至提示缺 .dll 文件,或者“缺少运行库”。是不是很慌?然后挨个找补丁,找安装包。 今天分享的这个“游戏常用运行库合集”,就是专门为这些情况准备的一套工具。它把那些…

2026/5/17 11:04:59 阅读更多 →
Windows 11 源码编译 vLLM 0.16 完全指南(CUDA 12.6 / PyTorch 2.7.1+cu126)

Windows 11 源码编译 vLLM 0.16 完全指南(CUDA 12.6 / PyTorch 2.7.1+cu126)

Windows 11 源码编译 vLLM 0.16 完全指南(CUDA 12.6 / PyTorch 2.7.1cu126)【再次实战检验】 本文是上篇 vLLM Windows cu128 编译指南 的复盘版本。上篇使用 CUDA 12.8 编译,本篇使用 CUDA 12.6 重新编译,与 PyTorch 2.7.1cu126 …

2026/7/3 13:18:26 阅读更多 →

最新新闻

5分钟上手Flask-profiler:从安装到性能分析的完整教程

5分钟上手Flask-profiler:从安装到性能分析的完整教程

5分钟上手Flask-profiler:从安装到性能分析的完整教程 【免费下载链接】flask-profiler a flask profiler which watches endpoint calls and tries to make some analysis. 项目地址: https://gitcode.com/gh_mirrors/fl/flask-profiler Flask-profiler是一…

2026/7/4 6:30:48 阅读更多 →
Frozen实战案例:如何使用Frozen构建物联网设备配置管理系统

Frozen实战案例:如何使用Frozen构建物联网设备配置管理系统

Frozen实战案例:如何使用Frozen构建物联网设备配置管理系统 【免费下载链接】frozen JSON parser and generator for C/C with scanf/printf like interface. Targeting embedded systems. 项目地址: https://gitcode.com/gh_mirrors/fro/frozen 在物联网设备…

2026/7/4 6:30:47 阅读更多 →
Windmill React UI黑暗模式实战:轻松实现优雅的深色主题切换

Windmill React UI黑暗模式实战:轻松实现优雅的深色主题切换

Windmill React UI黑暗模式实战:轻松实现优雅的深色主题切换 【免费下载链接】windmill-react-ui 🧩 The component library for fast and accessible development of gorgeous interfaces. 项目地址: https://gitcode.com/gh_mirrors/wi/windmill-rea…

2026/7/4 6:30:47 阅读更多 →
translate-python高级技巧:自定义翻译 provider 与错误处理最佳实践

translate-python高级技巧:自定义翻译 provider 与错误处理最佳实践

translate-python高级技巧:自定义翻译 provider 与错误处理最佳实践 【免费下载链接】translate-python Online translation as a Python module & command line tool. No key, no authentication needed. 项目地址: https://gitcode.com/gh_mirrors/tr/trans…

2026/7/4 6:28:47 阅读更多 →
FPDF版本1.9新特性解析:最新功能与改进

FPDF版本1.9新特性解析:最新功能与改进

FPDF版本1.9新特性解析:最新功能与改进 【免费下载链接】FPDF FPDF is a PHP class which allows to generate PDF files with pure PHP. F from FPDF stands for Free: you may use it for any kind of usage and modify it to suit your needs. 项目地址: https…

2026/7/4 6:28:47 阅读更多 →
nginx-auth-ldap性能优化终极指南:连接池配置与缓存策略提升认证效率

nginx-auth-ldap性能优化终极指南:连接池配置与缓存策略提升认证效率

nginx-auth-ldap性能优化终极指南:连接池配置与缓存策略提升认证效率 【免费下载链接】nginx-auth-ldap LDAP authentication module for nginx 项目地址: https://gitcode.com/gh_mirrors/ng/nginx-auth-ldap nginx-auth-ldap是一个强大的LDAP认证模块&…

2026/7/4 6:26:47 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻