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

C++进阶之bind绑定:用法实例(四百四十二)

简介:CSDN博客专家、《Android系统多媒体进阶实战》作者

博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址:Audio工程师进阶系列原创干货持续更新中……】🚀
Android多媒体专栏地址:多媒体系统工程师系列原创干货持续更新中……】🚀
专题一 二:AAOS车载系统+AOSP14系统攻城狮入门视频实战课🚀
专题三:Android14 Binder之HIDL与AIDL通信实战课🚀
专题四:Android15快速自定义与集成音效实战课🚀
专题五:Android15音频策略实战课🚀
专题六:Android15音频性能实战课(无声/杂音/断音/爆音实战案例)🚀

人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮


🍉🍉🍉文章目录🍉🍉🍉

      • 🌻1. 前言
      • 🌻2. C++ bind 介绍
      • 🌻3. 代码实例
        • 🌻3.1 基础用法:绑定全局函数与固定参数
        • 🌻3.2 进阶用法:绑定类成员函数
        • 🌻3.3 占位符重排序与参数调整
      • 🌻3.4 std::bind 总结

🌻1. 前言

本篇目的:C++ 进阶之 bind 绑定:用法实例

🌻2. C++ bind 介绍

  1. 基本概念
    std::bind是 C++11 引入的一个函数模板,位于<functional>头文件中。它充当了“函数适配器”的角色,能够将可调用对象(函数指针、成员函数、仿函数等)与其参数进行绑定,生成一个新的可调用对象。
  2. 功能
    允许将函数的部分参数固定(绑定),从而产生一个减少了参数个数的新函数。它支持占位符(Placeholders,如std::placeholders::_1),允许在调用新函数时再动态传入剩余的参数。
  3. 使用限制
    在使用占位符时必须指明命名空间std::placeholders;在绑定成员函数时,必须显式传递对象的地址(或指针);相比现代 Lambda 表达式,std::bind的语法较为冗长且类型推导相对复杂。
  4. 性能特性
    std::bind返回的是一个包装后的仿函数对象。在某些旧版编译器中,其开销可能略高于内联的 Lambda 表达式,但在现代编译器(如 GCC 12+ / Clang)的优化下,两者的性能差距通常可以忽略不计。
  5. 使用场景
    将成员函数转换为普通的函数回调、统一不同签名的函数接口、在异步任务(如std::thread或音视频处理回调)中预设特定的上下文字符。

🌻3. 代码实例

🌻3.1 基础用法:绑定全局函数与固定参数
  1. 应用场景
    通过std::bind固定函数的部分参数,简化调用逻辑。
  2. 用法实例
#include<iostream>#include<functional>voidaudio_output(intvolume,conststd::string&device){std::cout<<"Output to ["<<device<<"] at volume: "<<volume<<std::endl;}intmain(){// 使用占位符 _1 代表调用时的第一个参数,固定第二个参数为 "Speaker"autospeaker_output=std::bind(audio_output,std::placeholders::_1,"Speaker");// 只需要传递 volume 参数speaker_output(75);speaker_output(90);return0;}
🌻3.2 进阶用法:绑定类成员函数
  1. 应用场景
    在面向对象设计中,将特定的类实例成员函数转化为独立的函数对象,常用于事件驱动或定时器回调。
  2. 用法实例
#include<iostream>#include<functional>#include<string>classVideoEncoder{public:voidencode(intframeId,conststd::string&codec){std::cout<<"Encoding frame "<<frameId<<" using "<<codec<<std::endl;}};intmain(){VideoEncoder encoder;// 绑定成员函数必须:1. 取函数地址 2. 传入对象实例指针 3. 使用占位符autofast_encode=std::bind(&VideoEncoder::encode,&encoder,std::placeholders::_1,"H.265");fast_encode(101);fast_encode(102);return0;}
🌻3.3 占位符重排序与参数调整
  1. 应用场景
    演示如何通过std::placeholders改变原始函数的参数顺序,实现接口的灵活适配。
  2. 用法实例
#include<iostream>#include<functional>voidlog_message(conststd::string&level,conststd::string&msg){std::cout<<"["<<level<<"]: "<<msg<<std::endl;}intmain(){usingnamespacestd::placeholders;// 将原本的参数顺序对调:调用时的第一个参数传给 log_message 的第二个位置autoreverse_log=std::bind(log_message,_2,_1);// 调用时:_1 为 "Operation failed", _2 为 "ERROR"reverse_log("Operation failed","ERROR");return0;}

🌻3.4 std::bind 总结

关键字功能描述典型应用
std::bind绑定参数生成新可调用对象函数接口适配、回调函数封装
_1, _2, …占位符,代表调用时的参数位置动态参数传递、参数顺序重排
&Class::Func绑定成员函数地址成员函数转全局回调(配合 this 指针)
std::function存储 bind 返回的对象统一存储不同类型的可调用实体
http://www.jsqmd.com/news/425146/

相关文章:

  • 初中数学基础差?2026实测4家靠谱线上机构,精准补漏不踩坑|家长收藏 - 品牌测评鉴赏家
  • 改进粒子群算法优化混合储能系统容量配置程序
  • 《从0到1!AI应用架构师对比学习实践的快速入门指南》
  • Tic Tac DREAMIN’
  • go基础之流程控制
  • 中考数学提分|实测4家主流线上机构,避坑不踩雷,直接抄作业 - 品牌测评鉴赏家
  • 2026青木川古镇民宿权威排名|青云客栈蝉联第一,自驾亲子首选(附避坑指南) - 一个呆呆
  • 初中数学线上培训机构推荐|4家实测不踩坑,适配不同基础孩子 - 品牌测评鉴赏家
  • if language is ONLY for the sounds for chating。
  • 初中数学培优选对线上机构,少走1年弯路!实测4家主流平台,家长直接抄作业 - 品牌测评鉴赏家
  • 小学数学培优|2026实测3家线上机构,家长闭眼冲不踩坑 - 品牌测评鉴赏家
  • 100种思维模型概念(多个角度分析问题)
  • 小学数学基础差?4家靠谱线上机构实测推荐!家长闭眼抄作业 - 品牌测评鉴赏家
  • 多项式和生成函
  • 背单词 纯英文 2026年03月
  • 冲刺中考数学哪家线上辅导班好?实测5家,家长闭眼冲不踩坑 - 品牌测评鉴赏家
  • .NET周刊【月第期 --】
  • 定速风电机组:老派硬核选手的倔强
  • 成人高考在2026年怎么选?主要类型与适配场景分析 - 速递信息
  • 2026年单北斗GNSS水库变形监测系统推荐排行榜
  • 初中数学基础差?3家靠谱线上机构实测!避坑不花冤枉钱 - 品牌测评鉴赏家
  • 一生一芯学习:PA:输入输出
  • 初中数学线上培训实测!4家机构盘点,提分不踩坑(家长必看) - 品牌测评鉴赏家
  • 孩子皮肤敏感易泛红适配面霜品牌推荐 - 速递信息
  • 中考数学冲刺|实测!不踩坑、真提分,家长直接抄作业 - 品牌测评鉴赏家
  • ZKEACMS:基于ASP.Net Core开发的开源免费内容管理系统
  • 基于MATLAB/Simulink的电动车制动能量回收控制策略搭建及整车参数分析
  • 【2026 OPC计划】3分钟部署你的AI助理-CoPaw
  • ​每周质量报告丨起泡胶、捏捏乐、水晶泥……警惕网红玩具背后的“隐形伤害”央视新闻2026-03-01 15:40北京中央广播电视总台央视新闻官方账号​——为什么总是玩具问题不断?
  • 【2026 OPC计划】AI的贾维斯时刻-OpenClaw