C++11中的bind

官方文档对于bind接口的概述解释:Bind function arguments

在C++11中,std::bind 是一个非常有用的工具,用于将函数、成员函数或函数对象与特定的参数绑定在一起,生成一个新的可调用对象。std::bind 可以用于部分应用函数参数、改变参数的顺序、绑定成员函数等

#include <functional> // 需要包含这个头文件auto new_callable = std::bind(callable, arg1, arg2, ..., argN);
  • callable 可以是函数、函数指针、成员函数指针、函数对象等。

  • arg1, arg2, ..., argN 是传递给 callable 的参数。这些参数可以是具体的值,也可以是占位符 std::placeholders::_1, std::placeholders::_2, 等等。

示例
1. 绑定普通函数
#include <iostream>
#include <functional>void print_sum(int a, int b) {std::cout << a + b << std::endl;
}int main() {auto f = std::bind(print_sum, 10, 20);f(); // 输出 30return 0;
}

在这个例子中,std::bindprint_sum 函数与参数 1020 绑定在一起,生成了一个新的可调用对象 f。调用 f() 时,相当于调用了 print_sum(10, 20)

2. 使用占位符
#include <iostream>
#include <functional>void print_sum(int a, int b) {std::cout << a + b << std::endl;
}int main() {using namespace std::placeholders; // 引入占位符auto f = std::bind(print_sum, _1, _2);f(10, 20); // 输出 30auto g = std::bind(print_sum, _2, _1);g(10, 20); // 输出 30,参数顺序被交换return 0;
}

在这个例子中,_1_2 是占位符,表示在调用 fg 时传递的第一个和第二个参数。

3. 绑定成员函数
#include <iostream>
#include <functional>class MyClass {
public:void print_sum(int a, int b) {std::cout << a + b << std::endl;}
};int main() {MyClass obj;auto f = std::bind(&MyClass::print_sum, &obj, 10, 20);f(); // 输出 30using namespace std::placeholders;auto g = std::bind(&MyClass::print_sum, &obj, _1, _2);g(10, 20); // 输出 30return 0;
}

在这个例子中,std::bind 绑定了 MyClass 的成员函数 print_sum,并且需要传递一个对象指针 &obj作为第一个参数。

4. 绑定函数对象
#include <iostream>
#include <functional>struct Add {int operator()(int a, int b) const {return a + b;}
};int main() {Add add;auto f = std::bind(add, 10, 20);std::cout << f() << std::endl; // 输出 30using namespace std::placeholders;auto g = std::bind(add, _1, _2);std::cout << g(10, 20) << std::endl; // 输出 30return 0;
}

在这个例子中,std::bind 绑定了一个函数对象 add,并生成了一个新的可调用对象 fg

5.线程池

基于bind的作用,当我们在设计一些线程池,或者任务池的时候,就可以将将任务池中的任务设置为函数类型,函数的参数由添加任务者直接使用bind进行适配绑定设置,而任务池中的任务被处理,只需要取出一个个的函数进行执行即可。

这样做有个好处就是,这种任务池在设计的时候,不用考虑都有哪些任务处理方式了,处理函数该如何设计,有多少个什么样的参数,这些都不用考虑了,降低了代码之间的耦合度。

#include <iostream>
#include <functional>
#include <cstring>
#include <vector>void Print(const std::string& str, int x)
{std::cout << str << "--->" << x << std::endl;
}int main()
{using task_t = std::function<void()>;std::vector<task_t> _task;_task.push_back(std::bind(Print, "wuxu", 666));_task.push_back(std::bind(Print, "cdd", 888));_task.push_back(std::bind(Print, "Mudu", 666));for(auto& f : _task)f();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12263.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt网络相关

“ 所有生而孤独的人&#xff0c;葆有的天真 ” 为了⽀持跨平台, QT对⽹络编程的 API 也进⾏了重新封装。本章会上手一套基于QT的网络通信编写。 UDP Socket 在使用Qt进行网络编程前&#xff0c;需要在Qt项目中的.pro文件里添加对应的网络模块( network ). QT core gui net…

会计学基础

【拯救者】会计学基础速成&#xff08;期末 复试 升本均可用&#xff09; ©无忌教育 重点: 适用课本: 会计基础 会计基础是指会计工作的基本原则和方法&#xff0c;它努力为会计核算提供一个共同的基础&#xff0c;以便各种组织在会计核算上得到一致的结果。会计基础主要…

我们信仰AI?从神明到人工智能——信任的进化

信任的进化&#xff1a; 信任是我们最宝贵的资产。而现在&#xff0c;它正像黑色星期五促销的廉价平板电视一样&#xff0c;被一点点拆解。在过去&#xff0c;世界很简单&#xff1a;人们相信晚间新闻、那些满是灰尘书籍的教授&#xff0c;或者手持病历、眉头紧锁的医生。而如…

《DeepSeek R1:7b 写一个python程序调用摄像头获取视频并显示》

C:\Users\Administrator>ollama run deepseek-r1:7b hello Hello! How can I assist you today? &#x1f60a; 写一个python程序调用摄像头获取视频并显示 好&#xff0c;我需要帮用户写一个Python程序&#xff0c;它能够使用摄像头获取视频&#xff0c;并在屏幕上显示出…

Linux网络 | 进入数据链路层,学习相关协议与概念

前言&#xff1a;本节内容进入博主讲解的网络层级中的最后一层&#xff1a;数据链路层。 首先博主还是会线代友友们认识一下数据链路层的报文。 然后会带大家重新理解一些概念&#xff0c;比如局域网交换机等等。然后就是ARP协议。 讲完这些&#xff0c; 本节任务就算结束。 那…

Python 科学计算

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

18.[前端开发]Day18-王者荣耀项目实战(一)

01-06 项目实战 1 代码规范 2 CSS编写顺序 3 组件化开发思想 组件化开发思路 项目整体思路 – 各个击破 07_(掌握)王者荣耀-top-整体布局完成 完整代码 01_page_top1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8…

Java 大视界 -- Java 大数据在智能医疗影像诊断中的应用(72)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 一、…

知识管理平台在提升组织智慧与执行力方面的关键作用探讨

内容概要 知识管理平台是现代组织在日益激烈的竞争环境中提升自身智慧和执行力的重要工具。其基本概念在于通过系统化的方式收集、整理和共享知识资源&#xff0c;确保组织内部的信息流畅和决策信息的及时性。这不仅强化了团队成员之间的沟通与协作&#xff0c;还促进了对复杂…

STM32F103ZET6完整技术点(持续更新~)

①STM32②F③103④Z⑤E⑥T⑦6简介&#xff1a; ①基于ARM核心的32位微控制器&#xff0c;②通用类型&#xff0c;③增强型&#xff0c;④引脚数目144个 ⑤闪存存储器容量&#xff1a;512K字节&#xff0c;⑥封装:LQFP&#xff0c;⑦温度范围&#xff1a;工业级温度范围&#xf…

交叉验证、精确率、召回率

1. 交叉验证 交叉验证是在机器学习建立模型和验证模型参数时常用的办法。交叉验证&#xff0c;顾名思义&#xff0c;就是重复的使用数据&#xff0c;把得到的样本数据进行切分&#xff0c;组合为不同的训练集和测试集&#xff0c;用训练集来训练模型&#xff0c;用测试集来评估…

sql表的增删改、替换

一、增加 1、向原表的字段中插入多条记录的方法 # mysql中常用的三种插入数据的语句: # insert into表示插入数据&#xff0c;数据库会检查主键&#xff0c;如果出现重复会报错&#xff1b; # replace into表示插入替换数据&#xff0c;需求表中有PrimaryKey&#xff0c; # 或…

执行策略更改

执行策略三种模式&#xff1a; Restricted&#xff1a;不允许运行任何脚本&#xff08;这是默认设置&#xff09;。RemoteSigned&#xff1a;允许本地脚本运行&#xff0c;但从互联网下载的脚本需要有效的签名才能运行。Unrestricted&#xff1a;允许所有脚本运行&#xff0c;…

如何创建折叠式Title

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了SliverGrid组件相关的内容&#xff0c;本章回中将介绍SliverAppBar组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的SliverAppBar和普通的AppBar类似&#xff0c;它们的…

[Proteus仿真]基于51单片机的智能温控系统

[Proteus仿真]基于51单片机的智能温控系统 基于51单片机的智能温控系统&#xff1a;DS18B20精准测温LCD1602双屏显示三键设置上下限声光报警&#xff0c;支持温度校准、抗干扰设计、阈值记忆。 一.仿真原理图 ​​ 二.模块介绍 温度采集模块&#xff08;DS18B20&#xff0…

RAG 与历史信息相结合

初始化模型 # Step 4. 初始化模型, 该行初始化与 智谱 的 GLM - 4 模型进行连接&#xff0c;将其设置为处理和生成响应。 chat ChatZhipuAI(model"glm-4",temperature0.8, ) 此提示告诉模型接收聊天历史记录和用户的最新问题&#xff0c;然后重新表述问题&#x…

【Redis】安装配置Redis超详细教程 / Linux版

Linux安装配置Redis超详细教程 安装redis依赖安装redis启动redis停止redisredis.conf常见配置设置redis为后台启动修改redis监听地址设置工作目录修改密码监听的端口号数据库数量设置redis最大内存设置日志文件设置redis开机自动启动 学习视频&#xff1a;黑马程序员Redis入门到…

神经网络参数量和运算量的计算- 基于deepspeed库和thop库函数

引言 最近需要对神经网络的参数量和运算量进行统计。找到一个基于deepspeed库函数计算参数量和运算量的例子。而我之前一直用thop库函数来计算。 看到有一篇勘误博文写道使用thops库得到的运算量是MACs (Multiply ACcumulate operations&#xff0c;乘加累积操作次数&#xf…

小程序-基础加强

前言 这一节把基础加强讲完 1. 导入需要用到的小程序项目 2. 初步安装和使用vant组件库 这里还可以扫描二维码 其中步骤四没什么用 右键选择最后一个 在开始之前&#xff0c;我们的项目根目录得有package.json 没有的话&#xff0c;我们就初始化一个 但是我们没有npm这个…

HTMLCSS :下雪了

这段代码创建了一个动态的雪花飘落加载动画&#xff0c;通过 CSS 技术实现了雪花的下落和消失效果&#xff0c;为页面添加了视觉吸引力和动态感。 大家复制代码时&#xff0c;可能会因格式转换出现错乱&#xff0c;导致样式失效。建议先少量复制代码进行测试&#xff0c;若未能…