当前位置: 首页 > article >正文

包装器简介

可调用对象可以使用运算符进行调用的对象本质是能像函数一样使用的东西常见课调用对象函数指针仿函数lambda表达式我们能否使用统一的方式对其封装进行调用这时候就可以使用包装器function包装器function包装器也就function适配器function把所有可调用对象包装成统一类型方便后续的调用templateclass F, class T T useF(F f, T x) { static int count 0; cout count: count endl; cout count: count endl; return f(x); } double f(double i) { return i / 2; } struct Functor { double operator()(double d) { return d / 3; } }; int main() { // 函数指针 cout useF(f, 11.11) endl; // 函数对象 cout useF(Functor(), 11.11) endl; // lambda表达式 cout useF([](double d)-double { return d / 4; }, 11.11) endl; return 0; }思考每次打印的count地址相同吗原因函数指针仿函数lambda表达式是不同的类型不同的类型调用函数模板时会实例出不同的函数所以count在不同的函数中地址不同为了统一可调用对象的类型function出现std::function在头文件functional// 类模板原型如下 template class T function; // undefined template class Ret, class... Args class functionRet(Args...);使用方式//第一个double为返回类型里面的double为需要的参数 functiondouble(double) f1 f; coutf1(1.2)endl; functiondouble(double) f2 Functor(); coutf2(2.2)endl; functiondouble(double) f3 [](double d)-double { return d / 4; }; coutf3(3.3)endl;包装器解决了可调用对象的类型问题既然统一了类型就可以放到容器里面方便统一处理运用vectorfunctiondouble(double) arr1 { f1,f2,f3 }; vectorfunctiondouble(double) arr2 { f,Functor(),[](double d)-double { return d / 4; } }; double n 1.0; for (auto e : arr2) { cout e(n) endl; }对于类成员函数class Plus { public: double plus1(double a, double b) { return a b; } static int plus2(int a, int b) { return a b; } }; int main() { functiondouble(Plus,double, double) f1 Plus::plus1; functionint(int, int) f2 Plus::plus2; Plus p; cout f1(p, 1.1, 2.2) endl;; cout f2(2, 3) endl; return 0; }绑定类成员函数首先告诉编译器是哪个类域中的函数且需要获取函数的指针对于类的非静态函数需要在第一个参数的传入类名代表该位置要传this指针原因类的非静态函数来说第一个参数为隐藏的this指针但是在包装器对象调用时我们并没有直接传类对象的地址原因在于std::function会自动把对象转化为this指针不用手动取p。对于类的静态函数不需要传this指针因为类的静态函数是属于整个类的而非单个对象对其进行包装后直接调用即可templateclass F, class T T useF(F f, T x) { static int count 0; cout count: count endl; cout count: count endl; return f(x); } double f(double i) { return i / 2; } struct Functor { double operator()(double d) { return d / 3; } }; int main() { functiondouble(double) f1 f; functiondouble(double) f2 Functor(); functiondouble(double) f3 [](double d)-double { return d / 4; }; useF(f1, 1.1); useF(f2, 2.1); useF(f3, 3.1); return 0; }最后来看上面的场景通过包装后包装器对象掉泪函数模板函数中count的地址是同一份地址说明类型相同bindbind是一个函数模板它就像一个函数包装器接收一个可调用对象生成一个新的可调用对象来适应元对象的参数列表通俗一点来讲就是bind就是提前给函数绑定参数一般而言对于一个原本接收N个参数的函数我们可以通过绑定一些参数返回一个接收M个参数的新函数同时bind也可以通过绑定实现参数顺序的调整// 原型如下 template class Fn, class... Args bind (Fn fn, Args... args); template class Ret, class Fn, class... Args bind (Fn fn, Args... args);bind的一般形式auto newCallablebind(callable,arg_list);int sub(int a, int b) { return a - b; } int main() { functionint(int, int) sub1 bind(sub, placeholders::_1, placeholders::_2); cout sub1(2, 1) endl; //交换参数顺序 functionint(int, int) sub2 bind(sub, placeholders::_2, placeholders::_1); cout sub2(2, 1); return 0; }第二张图表明bind将第一个参数绑定到形参的第二个位置将第二个参数绑定到形参的第一个个位置实现了参数的交换补充placeholders是一个命名空间内部定义了第几个形参_1指第一个形参_2指第二个参数等等一些场景中我们希望对于函数中的形参绑定一些确定的值满足我们的一些需求这时我们可以使用缺省参数来对形参进行绑定一些值但是这个绑定之后就不能修改了这个时候我们就可是使用bind来对形参进行绑定绑定出来的可调用对象是独立的可调用对象之间绑定的值互不影响double getRate(double a, double b, double rate) { return (a b) * rate; } int main() { functiondouble(double, double) f1 bind(getRate, placeholders::_1, placeholders::_2, 4.0); functiondouble(double, double) f2 bind(getRate, placeholders::_1, placeholders::_2, 5.1); cout f1(2, 3) endl; coutf2(2,3)endl; return 0; }同时注意需要绑定的值无论在形参的什么位置都不参与形参的顺序。不影响placeholders的参数的顺序对于类成员函数的绑定class SubType { public: static int sub(int a, int b) { return a - b; } int ssub(int a, int b, int rate) { return (a - b) * rate; } }; int main() { functionint(int, int) f1 bind(SubType::sub, placeholders::_1, placeholders::_2); functionint(int, int) f2 bind(SubType::ssub, SubType(),placeholders::_1, placeholders::_2,3); SubType s; functionint(int, int) f3 bind(SubType::ssub, s, placeholders::_1, placeholders::_2, 3); functionint(int, int) f4 bind(SubType::ssub, s, placeholders::_1, placeholders::_2, 3); cout f1(2, 1)endl; cout f2(2, 1) endl; return 0; }绑定类成员函数首先要告诉编译器是哪个类域里面的函数且需要获取函数的指针对于非静态函数还需要获取对象或其地址方便底层的调用且其类成员函数参数隐藏this指针

相关文章:

包装器简介

可调用对象:可以使用()运算符进行调用的对象,本质是能像函数一样使用的东西常见课调用对象:函数指针,仿函数,lambda表达式我们能否使用统一的方式对其封装,进行调用,这时…...

如何实现精准歌词同步?KRC格式全解析与应用实践

如何实现精准歌词同步?KRC格式全解析与应用实践 【免费下载链接】KuGouMusicApi 酷狗音乐 Node.js API service 项目地址: https://gitcode.com/gh_mirrors/ku/KuGouMusicApi 在音乐应用开发中,歌词显示功能看似简单,实则隐藏着诸多技…...

OpenClaw任务编排:用Qwen3.5-4B-Claude实现爬虫+分析闭环

OpenClaw任务编排:用Qwen3.5-4B-Claude实现爬虫分析闭环 1. 为什么需要自动化任务编排 去年我接手了一个市场调研项目,需要每周从20多个网站抓取产品价格数据,清洗后生成趋势图表。最初用Python脚本手动Excel处理,每次要花3小时…...

大模型进阶必看:Agent Skills如何让AI开发更标准化、可复用?速收藏!

随着AI应用开发成熟,工具调用经历了Function Calling、MCP协议到Agent Skills三个阶段。Agent Skills通过文件系统原生设计,将指令、工作流和资源打包成可复用模块,革新上下文管理,实现代码即工具,摆脱供应商锁定。它使…...

6种压缩黑科技如何彻底解决文件处理的效率难题

6种压缩黑科技如何彻底解决文件处理的效率难题 【免费下载链接】7-Zip-zstd 7-Zip with support for Brotli, Fast-LZMA2, Lizard, LZ4, LZ5 and Zstandard 项目地址: https://gitcode.com/gh_mirrors/7z/7-Zip-zstd 为何压缩工具总是陷入"速度与压缩率"的两难…...

X-TRACK二次开发终极指南:如何基于开源框架快速扩展新功能

X-TRACK二次开发终极指南:如何基于开源框架快速扩展新功能 【免费下载链接】X-TRACK A GPS bicycle speedometer that supports offline maps and track recording 项目地址: https://gitcode.com/gh_mirrors/xt/X-TRACK X-TRACK是一款支持离线地图和轨迹记…...

OpenClaw+GLM-4.7-Flash学习助手:自动整理课程笔记与生成复习题

OpenClawGLM-4.7-Flash学习助手:自动整理课程笔记与生成复习题 1. 为什么需要自动化学习助手? 去年备考研究生时,我每天要处理3-4小时的课程视频。最痛苦的不是听课本身,而是课后整理:手动截取关键片段、转录字幕、标…...

突破语言边界:XUnity.AutoTranslator全场景应用指南

突破语言边界:XUnity.AutoTranslator全场景应用指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 当你打开一款期待已久的外文游戏,却被满屏陌生文字阻挡了探索的脚步&#xff1…...

探索AI原生应用领域向量数据库的无限潜力

探索AI原生应用领域向量数据库的无限潜力关键词:向量数据库、AI原生应用、Embedding、向量相似度、多模态检索、大模型协同、语义理解摘要:当AI从“辅助工具”进化为“原生生产力”,一种专为AI设计的数据库——向量数据库,正在重塑…...

嵌入式GUI技术选型与实现方案对比

1. 主流小型嵌入式GUI技术解析1.1 TouchGFX技术方案TouchGFX以其华丽的界面效果和流畅的动画著称,采用C语言开发,特别适合STM32系列MCU。其核心优势在于TouchGFX Designer工具,该工具提供:可视化界面设计环境丰富的控件库&#xf…...

大数据产品实战:用户画像系统的设计与实现

大数据产品实战:用户画像系统的设计与实现 关键词:用户画像、标签体系、大数据平台、精准营销、数据挖掘 摘要:用户画像系统是大数据时代企业实现“以用户为中心”运营的核心工具,它通过给用户“贴标签”的方式,将复杂的用户行为转化为可量化、可分析的数字特征。本文将从…...

拒了一个只要1.8万的45岁大佬

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享点击关注#互联网架构师公众号,领取架构师全套资料 都在这里0、2T架构师学习资料干货分上一篇:2T架构师学习资料干货分享大家好,我是互联网架构师&#xff…...

为什么你的Ping总是丢包?这7个隐藏原因90%的人都忽略了(含Wireshark分析技巧)

为什么你的Ping总是丢包?这7个隐藏原因90%的人都忽略了(含Wireshark分析技巧) 在网络运维的日常工作中,Ping命令就像网络工程师的听诊器,简单却至关重要。但当你发现Ping测试频繁丢包时,问题往往不像表面看…...

想给西安碑林、雁塔等区旧房装修?知名靠谱装修公司在哪找?

在西安碑林、雁塔等区拥有一套旧房,想要进行装修,却不知道如何找到知名靠谱的装修公司?别担心,本文将为你详细介绍选择装修公司的方法,并重点推荐西安王师傅装修工程有限公司,为你的旧房装修之旅提供可靠的…...

Spring Boot 中 Quartz 与 PostgreSQL 持久化实战:构建可视化定时任务管理平台

1. 为什么需要定时任务持久化 在企业级应用开发中,定时任务就像是一个不知疲倦的闹钟,每天准时叫醒你的业务逻辑。但传统的Scheduled注解方式有个致命缺陷——所有的任务配置都硬编码在代码里。想象一下,每次修改任务执行时间都需要重新部署应…...

OpenClaw跨平台实战:Windows到Mac的Qwen3-32B配置迁移

OpenClaw跨平台实战:Windows到Mac的Qwen3-32B配置迁移 1. 为什么需要跨平台配置迁移? 去年冬天,我在Windows工作站上搭建了一套基于Qwen3-32B的OpenClaw自动化系统,用于处理日常的文档整理和数据分析任务。当公司配发新款MacBoo…...

Python多进程+ZeroMQ+内存映射=真无锁?资深架构师用17个生产事故告诉你为什么92%的“去GIL”方案在高并发下静默失败

第一章:Python无锁GIL环境下的并发模型避坑指南Python 的全局解释器锁(GIL)长期被误认为是“无锁”环境,实则恰恰相反——GIL 是 CPython 解释器中一把严格的互斥锁,它确保任意时刻仅有一个线程执行 Python 字节码。所…...

智能记账本:OpenClaw+Qwen3.5-9B自动归类信用卡消费邮件

智能记账本:OpenClawQwen3.5-9B自动归类信用卡消费邮件 1. 为什么需要自动化记账工具 每次收到银行消费短信时,我都会陷入两难:手动记账太繁琐,不记账又会导致月度消费分析失真。传统记账软件需要手动输入金额和分类&#xff0c…...

Mojo+Python混合项目部署失败全记录(含完整错误日志溯源与跨运行时调试手册)

第一章:MojoPython混合项目部署失败全记录(含完整错误日志溯源与跨运行时调试手册)在将 Mojo 模块嵌入 Python 3.11 环境的 CI/CD 流水线中,首次构建即触发运行时崩溃。核心现象为 mojo_runtime_init() 在 Python 进程内调用后立即…...

告别频繁输密码!域环境下Windows软件静默安装的两种野路子(慎用)

告别频繁输密码!域环境下Windows软件静默安装的两种野路子(慎用) 在中小企业IT运维的日常中,软件批量部署和远程协助安装堪称两大高频痛点。想象这样的场景:财务部急需更新报税软件,二十台电脑需要同时处理…...

OpenClaw技能市场指南:Qwen3.5-4B-Claude适配的20个实用模块

OpenClaw技能市场指南:Qwen3.5-4B-Claude适配的20个实用模块 1. 为什么需要关注技能市场? 第一次接触OpenClaw时,我以为它只是个能执行简单命令的自动化工具。直到在ClawHub技能市场里发现"会议纪要生成器"模块,才意识…...

SRS + FFmpeg WebRTC 循环推流环境搭建

SRS FFmpeg WebRTC 循环推流环境搭建指南 本指南介绍如何使用 Docker Compose 快速搭建一个基于 SRS (Simple Realtime Server) 的流媒体测试环境。 推流协议:RTMP (FFmpeg 模拟推流)拉流协议:WebRTC (低延迟播放)特性:视频循环播放、不保存…...

【PyCon 2024核心议题首发】:CPython 3.13 asyncio重构内幕——原生任务取消语义、零拷贝Socket API与异步GC优化前瞻

第一章:PyCon 2024与CPython 3.13异步演进全景图PyCon 2024于五月在匹兹堡圆满落幕,其核心议题之一正是CPython 3.13的异步能力跃迁。作为首个将async/await语义深度融入解释器底层的Python版本,3.13引入了原生协程调度优化、零拷贝内存视图支…...

开局掌控者:EdB Prepare Carefully - RimWorld自定义体验革命

开局掌控者:EdB Prepare Carefully - RimWorld自定义体验革命 【免费下载链接】EdBPrepareCarefully EdB Prepare Carefully, a RimWorld mod 项目地址: https://gitcode.com/gh_mirrors/ed/EdBPrepareCarefully 副标题:如何告别随机开局&#xf…...

OpenClaw智能邮件助手:nanobot镜像自动分类与回复重要邮件

OpenClaw智能邮件助手:nanobot镜像自动分类与回复重要邮件 1. 为什么需要智能邮件助手 每天早晨打开邮箱,看到堆积如山的未读邮件总是让人头疼。重要客户的询盘可能被埋没在促销广告中,紧急的协作请求可能因为延迟回复而影响项目进度。作为…...

如何通过Universal Android Debloater实现Android设备深度优化

如何通过Universal Android Debloater实现Android设备深度优化 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery life of your device. …...

别再只盯着GPS了!从手机导航到无人机测绘,聊聊SPP、DGPS、RTK、PPP这几种定位技术到底该怎么选?

定位技术实战指南:从厘米级精度到全球覆盖的智能决策 站在一片待测绘的工地上,无人机工程师小王正面临一个关键抉择——该为这批新设备配置哪种定位模块?RTK的厘米级精度令人心动,但架设基准站的成本让他犹豫;PPP技术号…...

OpenClaw多通道管理:GLM-4.7-Flash同时对接飞书与钉钉的配置技巧

OpenClaw多通道管理:GLM-4.7-Flash同时对接飞书与钉钉的配置技巧 1. 为什么需要多通道管理? 上周我接到一个技术咨询需求:一个小型内容团队需要同时在飞书和钉钉两个平台上接收AI助手服务。他们的编辑用飞书,运营用钉钉&#xf…...

参数估计实战:从置信区间构建到样本量计算的完整指南

1. 参数估计的核心逻辑:从抽样到推断 第一次接触参数估计时,我盯着那个95%置信区间看了半小时——它既不像天气预报的降水概率,也不像考试分数的百分比排名。后来在分析用户行为数据时才恍然大悟:参数估计本质是用样本数据给总体参…...

iMeta入选新锐期刊分区表生物学1区Top

2026年3月24日,2026年新锐期刊分区表正式发布。iMeta被评选为生物学1区Top期刊,标志着iMeta期刊学术声誉与影响力持续提升。自创刊以来,iMeta的每一步成长都离不开期刊编委、审稿专家及广大同行的鼎力支持。未来,iMeta将再接再厉&…...