C语言对话-14.The Bind That Ties 📅 发布时间:2026/7/11 7:58:12 👁️ 浏览次数: 徐波 翻译尽管亚洲船队的到来已是迫在眉睫而且我们的高官们未就此事公开发表评论但我们的生活却回复平静几乎和以往一样普通。谣声渐起且有蔓延之势但外星文物的发掘和研究工作仍有条不紊地进行着。珍妮和我正手忙脚乱地修补一个破裂水管的分枝。一根“Y”水管的一个分枝突然破裂水迅猛地喷出把她淋了个落汤鸡。“快过来帮忙”她大声叫喊试图用一只人工封口将它盖住防止水喷射但明显无济于事。我赶紧拿了一只夹子把封口夹住然后迅速将封口固定住。夹子被适当地与封口固定牢后水注只剩下几道小水流接着就止住了大功告成。现在“Y”形水管的一个分枝已被封死水只能流向另外一个分枝。“是不是又让你想起了你的第一个工作。”珍妮边说边用毛巾擦着蓬乱的头发。我咧嘴一笑“确实如此。尝试过太多的选择后只剩下一个…”Guru正对我最近摆弄过的一些代码进行回顾。一切都还正常直到她遇到下面这个函数void f(std::vectorint vect){std::vectorint::iterator firstOne;for (firstOne vect.begin();firstOne ! vect.end();firstOne){doSomething(*firstOne, Some string literal);}}Guru抬头看看会议桌对面的我“我的孩子这个函数并无必要。你可以用受宠的for_each函数来完成同样的功能。”由于还有个学生也在席所以她用词严肃。我表示歉意看到那个可怜的学生的脸上流露出几分惧意又感到同情。“嗯”我低声说道“是这样的我试过for_each但它需要一个只接受一个参数的函数。可我必须向doSomething传递两个参数所以无法使用for_each。”我的回答让她眉头更锁“你有没有考虑过使用适配器(adaptor)象bind1st?”我怯生生地申辩道“是这样的blindlst看上去总有点复杂我怎么也想不出它“捆绑bind”参数是什么意思所以我属于那种……反正我没考虑用它。”我以为Guru会摆出导师的架子狠狠地瞪我。但她只是平静地点点头嘴角写出淡淡的笑意“我的孩子当你面对你不理解的东西时千万不可胆怯。必须承认自己的无知勇敢地面对它你才会长进。”她若有所思地停顿了一下。“让我们从头开始”她接着说“为简单起见我把bind1st和bind2nd简称为bind函数这样你就可以把二元函数对象当作一元函数对象来使用。”“所以”我慢声说道“你的意思是因为doSomething函数接受两个参数它是个二元函数也就是说我可以使用bind1st函数把它转换成一个一元函数是不是”“很好我的学徒工。你走对了路子但还不够深入。我说过bind函数允许你使用二元函数对象。特别地bind函数使用的函数对象必须从binary_function派生或必须提供跟binary_function一样的typedef形式。现在有了这些信息你该怎样修改你的作品来使用functor呢”有时候我觉得Guru这种苏格拉底式的方法比我大学时的任何考试都要紧张压力也更大。感受到她咄咄逼人的目光我开始在白写字板上细心书写我听到Guru清了清嗓子便扭过头去她递给我一本Stroustrup的经典作品我快速地查阅了一下binary_function:template class Arg, class Arg2, class Resstruct binary_function {typedef Arg first_argument_type;typedef Arg2 second_argument_type;typedef Res result_type;}; [1]“好家伙一上来就出错。”我心想把类的声明修改为class doSomething :public std::binary_functionint, const char *, void{public:void operator()(int intVal, const char *c){// ... 你要做的事 ...}};我回头看看Guru。“干得不错”她赞许地点点头“现在就剩下怎样使用bind函数了。其实也很简单象bind1st(operation,value)这样的表达式告诉编译器将value捆绑到operation的第一个参数。换句话说当编译器在for_each函数中调用operation时它就把value作为第一个参数来传递把已提领的dereferenced的iterator作为第二个参数就象这样。”她拿起笔在书写板中写道operation(value, *iterator)“用这种思路来想问题”Guru接着说“使用bindlst后第一个参数便被固定为某种特定的值不会再改变。第二个参数在其遍历范围内依次传递给各个对象只有它才会变化。这样二元函数对象现在就可以象一元函数对象那样使用了。”“就是这样”我眨了眨眼睛“这么简单”Guru点点头“是的我的孩子就是这么简单? bind2nd也差不多告诉编译器将给定的值捆绑到第二个参数。现在给我看看你怎样替换或重写你的f函数。”我在白书写板上写道std::for_each(vect.begin(), vect.end(),bind2nd(doSomething(), Hi));她点点头“非常好我的学徒工。你已经意识到传给bind2nd的第一个参数必须是你的functor的一个实例这样你就创建了一个未命名的临时对象。”我不好意思地笑了笑我并不想假装括号是无意加上去的我只是已经用惯了这种冗余写法。“我们的代码回顾结束时”她接着说“我希望你写一个小型测试程序来加深你的理解。”代码回顾结束后我回到我的蜗居写了一个小程序。经过一些小小的完善后最终的形式如下#include vector#include iostream#include functional#include iterator#include algorithmvoid doSomething(int i, const char *c);// 我的第一个二元功能函数// 首先我假定doSomething是某个库函数// 我并没有它的源代码。// 关于可移植性MS VC6.0不喜欢在模板的返回类型中使用void// 所以在MS VC6.0中对operator( )稍作修改使它返回一个类型如truestruct doSomethingWrapper : publicstd::binary_functionint, const char *, void{void operator()(int iValue, const char *cValue) const{doSomething(iValue, cValue);}};// 现在就建立了一个内部的功能函数。// 关于可移植性同上。struct doSomethingDirect : publicstd::binary_functionint, const char *, void{void operator()(int iValue, const char *cValue) const{std::cout cValue iValue . ;}};// 这是个帮助器模板因为我比较懒它能减少打字量。template class Collection, class FunctionFunction for_all(Collection c, const Function f){return std::for_each(c.begin(), c.end(), f);}int main(){// 首先建立vector。std::vectorint vect;for (int i0; i10; i) {vect.push_back(i);}for_all(vect, std::bind2nd(doSomethingWrapper(), Wrapper:));std::cout \n;for_all(vect, std::bind2nd(doSomethingDirect(), Direct:));return 0;}// 我独树一帜的第三方库函数void doSomething(int i, const char *c){std::cout c i . ;}“这里面再加上个基于容器的算法真是匠心独运啊”我高兴地祝贺自己权当自己是第一个想到该主意的人事实上当然不是这样。“这也很有独创性啊”我叹了口气拍了拍已经安静下来的水管分枝“可惜我们需要两个分枝都能工作唉只能把整个都换掉了……”我们面面相觑。“明天吧。”珍妮一边拧她制服上的水一边说道。[注释][1] Bjarne Stroustrup. The C Programming Language, 3rd Edition (Addison-Wesley, 1997).
C语言对话-13.怎样持久化一个对象 徐波 翻译 当我疲惫地穿过走廊时,正是欧洲当地时间零点十分。我已经筋疲力尽,又有三个下午的值班在等着我。 一小束柔和的光散发到凉爽的金属走廊上。梅杰.吉尔伯的房门微开着,我想这是巧合,尽管通风系统最近工作负荷太重很可能… 2026/7/11 7:57:12
Java锁机制 概述 按实现层面划分 [内置锁]:synchronized是JVM层面实现的,无需手动释放锁,属于内置锁。[显式锁]:ReentrantLock为代表的显式锁,需要手动释放锁,功能更加灵活,位于java.util.concurrent.lock… 2026/7/6 20:49:45
计算机毕业设计springboot文档查重系统 完善诚信建设系统文档以满足检查要求基于SpringBoot的毕业论文相似度检测平台 基于SpringBoot的学术文献原创性审核系统 计算机毕业设计springboot文档查重系统vhg01b87 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 在数字化时代,文档的编写和传播变得前所未有地便捷,这也… 2026/7/5 16:35:17
基于VRIF 2.0与OpenXR的Pico串流应用开发:跨平台交互与一键部署实践 1. 项目概述与核心价值最近在折腾Pico一体机上的串流应用开发,发现跨平台适配和部署流程真是让人头大。不同的设备、不同的运行时,光是处理输入映射和渲染管线就能耗掉大把时间。后来我接触到VRIF 2.0和OpenXR这套组合拳,实测下来,… 2026/7/11 7:57:18
Bloome多Agent协作平台:AI智能体协同工作流实战指南 在AI技术快速发展的今天,开发者们经常面临一个痛点:单个AI助手虽然强大,但在复杂任务中往往显得力不从心,需要我们在不同工具间频繁切换,上下文信息难以共享。Bloome作为新兴的多Agent协作消息平台,正是为了… 2026/7/11 7:55:17
Qt 6.11.1 QTableWidget 实战:5步构建可编辑数据表格(附完整代码) Qt 6.11.1 QTableWidget 实战:5步构建可编辑数据表格(附完整代码)在桌面应用开发中,数据表格是最常见的UI组件之一。Qt框架提供的QTableWidget控件,让开发者能够快速实现功能完善的数据展示与编辑界面。本文将带你从零… 2026/7/11 7:53:16
Linux C++ 生产者消费者模型:3种同步机制对比与性能实测 Linux C 生产者消费者模型:3种同步机制对比与性能实测在并发编程领域,生产者消费者模型堪称多线程协作的"Hello World"。但当你真正将其应用于高吞吐量、低延迟的Linux C项目时,会发现简单的pthread实现往往难以满足性能需求。本文… 2026/7/11 7:51:15
Zynq PS 时钟子系统功耗优化:3 种 PLL 配置模式对比与实测分析 Zynq PS 时钟子系统功耗优化:3 种 PLL 配置模式对比与实测分析在嵌入式系统设计中,功耗优化一直是工程师们关注的重点。对于采用Xilinx Zynq系列SoC的设计来说,处理系统(PS)的时钟子系统功耗占据了整体功耗的相当比例。… 2026/7/11 7:51:15
OpenClaw与Hermes Agent框架深度对比:架构同构、选型避坑与医疗场景落地指南 1. 项目概述:当两个开源Agent框架在GitHub上“撞脸”最近在AI工程圈里,一个词频繁出现在技术群、PR评论区和深夜的Stack Overflow搜索记录里——OpenClaw和Hermes Agent。不是新发布的模型权重,也不是某家大厂的闭源平台,而是两个… 2026/7/11 7:51:15
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08