前言

1. std::bind概述

std::bind是C++11引入的功能模板,位于<functional>头文件中,用于将函数、成员函数或函数对象与特定参数绑定,生成一个新的可调用对象。

1.1 基本用法

#include <iostream>
#include <functional>void print_sum(int a, int b) {std::cout << a + b << std::endl;
}int main() {// 绑定函数和参数auto bound_print = std::bind(print_sum, 10, std::placeholders::_1);bound_print(20);  // 输出30,相当于print_sum(10, 20)return 0;
}

std::bind 将函数 print_sum 和部分参数绑定,生成一个新的可调用对象 bound_printstd::placeholders::_1 表示调用 bound_print 时的第一个参数会传递给 print_sum 的第二个形参 b。绑定时已固定的参数(如 10)在调用时不再需要传入。

 默认行为:按值捕获参数

int x = 10;
auto bound = std::bind(f, x);  // x被复制
x = 20;
bound();  // 使用x的副本(值为10)

引用捕获:使用std::ref或std::cref

int x = 10;
auto bound = std::bind(f, std::ref(x));  // x被引用捕获
x = 20;
bound();  // 使用x的引用(值为20)

1.2 占位符

std::placeholders::_1_2, ..., _N表示调用时传入的第1, 2, ..., N个参数

void print_values(int a, int b, int c) {std::cout << a << ", " << b << ", " << c << std::endl;
}int main() {auto bound_func = std::bind(print_values, std::placeholders::_2,std::placeholders::_1,100);bound_func(10, 20);  // 输出20, 10, 100return 0;
}

调用 bound_func(10, 20) 时: _1 对应第一个实参 10 → 传给原函数的 b   _2 对应第二个实参 20 → 传给原函数的 a  c 始终为固定值 100

1.3 绑定成员函数

绑定成员函数时需要传入对象指针或引用:

class MyClass {
public:void print(int x) {std::cout << "Value: " << x << std::endl;}
};int main() {MyClass obj;auto bound_member = std::bind(&MyClass::print, &obj, std::placeholders::_1);bound_member(42);  // 输出Value: 42return 0;
}
成员函数指针&MyClass::print 是 MyClass 的成员函数 print 的指针。在 C++ 中,成员函数指针必须通过类的对象(或指针)来调用。std::bind 绑定成员函数std::bind 的第一个参数是成员函数指针,第二个参数是对象的指针(&obj),后续参数是成员函数的参数(用占位符或固定值)。 占位符 _1std::placeholders::_1 表示调用 bound_member 时的第一个参数会传递给 print 的 x 调用方式bound_member(42)

2. 完美转发(Perfect Forwarding)

完美转发是指在函数模板中将参数以原始类型转发给另一个函数,保持参数的值类别(左值、右值)不变。

2.1 引用折叠规则

完美转发基于引用折叠规则:

  • T& & → T&   T& && → T&    T&& & → T&   T&& && → T&&

2.2 完美转发示例

#include <utility>void process(int& x) { std::cout << "lvalue: " << x << std::endl; }
void process(int&& x) { std::cout << "rvalue: " << x << std::endl; }template<typename T>
void wrapper(T&& arg) {process(std::forward<T>(arg));  // 完美转发
}int main() {int x = 10;wrapper(x);       // 调用lvalue版本wrapper(20);      // 调用rvalue版本wrapper(std::move(x)); // 调用rvalue版本return 0;
}

 wrapper(x)(左值)x 是左值(有名变量),T 推导为 int&std::forward<int&>(arg) 返回左值引用。调用 process(int&),输出 lvalue: 10

wrapper(20)(右值)20 是右值(临时值),T 推导为 intstd::forward<int>(arg) 返回右值引用。调用 process(int&&),输出 rvalue: 20

 wrapper(std::move(x))(右值)std::move(x) 将 x 转为右值,T 推导为 intstd::forward<int>(arg) 返回右值引用。调用 process(int&&),输出 rvalue: 10

3. 注意事项

只在模板函数中使用   转发后不要再用该参数、不要重复转发同一个参数

记住:T&& + forward<T> 就是完美转发的全部秘诀


总结

  1. std::bind用于部分应用和参数重排序    完美转发保持参数的值类别

  2. 现代C++中优先考虑lambda表达式   需要完美转发时,确保正确使用std::forward

通过理解这些概念,可以编写更灵活、高效的C++代码,特别是在涉及回调、延迟调用和泛型编程的场景中。

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

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

相关文章

【Dify精讲】第14章:部署架构与DevOps实践【知识卡片】

第14章&#xff1a;部署架构与DevOps实践http://www.airinto.com/share/49997bb7 一、Docker 容器化方案&#xff1a;从开发到生产的统一 二、Kubernetes 部署&#xff1a;走向云原生 三、CI/CD 流程设计&#xff1a;自动化的艺术 四、高可用架构&#xff1a;让 AI 服务永不停歇…

el-cascader 设置可以手动输入也可以下拉选择

el-cascader 设置可以手动输入也可以下拉选择 稍微修改一下就可食用 <template slot"stationId" slot-scope""><div style"position: relative;"><!-- 可输入也可显示选项 --><el-input:value"stationNameInput"…

Unity Shader开发-着色器变体(1)-着色器变体概述

有时我们希望一份 Shader 源代码可能满足多种功能&#xff08;如处理法线贴图、自发光、不同光照模式、阴影&#xff0c;支持GPUInstacing等多种功能&#xff09;。所以我们需要能够实现Shader分支的方法。 一.Shader分支实现 主要有三种手段实现Shader分支&#xff1a; 1.静…

ECK 简化:在 GCP GKE Autopilot 上部署 Elasticsearch

作者&#xff1a;来自 Elastic Eduard Martin 学习如何使用 GKE Autopilot 和 ECK 在 GCP 上部署 Elasticsearch 集群。 想要获得 Elastic 认证&#xff1f;了解下一次 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有丰富的新功能&#xff0c;可以帮助你为…

测试一个软件的性能有哪些指标?

在测试软件性能时,通常会关注多个维度的指标,以评估系统在不同负载下的表现。以下是关键的性能测试指标分类和详细说明: 📊 核心性能指标分类 1. 响应时间(Response Time) 定义:从发送请求到接收到响应所花费的时间 细分: 平均响应时间:所有请求的平均耗时 *P90/P95…

浅析std::atomic<T>::compare_exchange_weak和std::atomic<T>::compare_exchange_strong

目录 std::atomic ::compare_exchange_weak 和 std::atomic ::compare_exchange_strong 核心原理 函数签名 核心区别 典型用法 1. compare_exchange_weak&#xff08;循环内重试&#xff09; 2. compare_exchange_strong&#xff08;单次尝试&#xff09; 底层机制 总…

举出一个异步接口测试的例子

以下是一个完整的 ​异步接口测试​ 实际案例&#xff0c;包含问题场景、解决方案、代码实现和面试回答技巧&#xff0c;适合在面试中展示技术深度&#xff1a; ​案例背景​ ​业务场景​&#xff1a; 测试一个AI图片生成平台的异步接口&#xff0c;用户提交生成请求后&#…

更新麒麟连不上外网

问题&#xff1a;更新麒麟连不上外网 处理&#xff1a;本地建个下载地址 建立文件夹/root/x86.rpm&#xff0c;子文件夹&#xff1a;Packages、repodata&#xff0c;和在线站点建的一样&#xff1a;Index of /NS/V10/V10SP1.1/os/adv/lic/base/x86_64/&#xff0c;然后就下载…

TensorFlow深度学习实战——使用Hugging Face构建Transformer模型

TensorFlow深度学习实战——使用Hugging Face构建Transformer模型 0. 前言1. 安装 Hugging Face2. 文本生成3. 自动模型选择和自动分词4. 命名实体识别5. 摘要生成6. 模型微调相关链接 0. 前言 除了需要实现特定的自定义结构&#xff0c;或者想要了解 Transformer 工作原理外&…

SAP-ABAP:SAP全模块的架构化解析,涵盖核心功能、行业方案及技术平台

一、核心业务模块&#xff08;Logistics & Operations&#xff09; 模块代号核心功能典型流程关键事务码物料管理MM采购/库存/发票校验采购到付款 (P2P)ME21N&#xff08;采购订单&#xff09;, MI31&#xff08;库存盘点&#xff09;销售与分销SD订单/定价/发货/开票订单…

实时预警!机场机坪井室无线智能液位监测系统助力安全降本

某沿海机场因地处多雨区域&#xff0c;每年雨季均面临排水系统超负荷运行压力。经勘测发现&#xff0c;5个井室因长期遭受地下水渗透侵蚀&#xff0c;井壁出现细微结构性裂缝&#xff0c;导致内部水位异常升高。作为机坪地下管网系统的核心节点&#xff0c;这些井室承担着雨水导…

边云协同 AI 视频分析系统设计方案

目录 一、项目背景与目标 二、系统架构概述 总体架构图 三、ER 图&#xff08;核心数据库设计&#xff09; 实体关系图简述 数据表设计&#xff08;简要&#xff09; 四、模型结构图&#xff08;边缘云端AI推理架构&#xff09; 边缘模型&#xff08;YOLOv5-tiny/PP-YO…

vue3整合element-plus

为项目命名 选择vue 框架 选择TS 启动测试&#xff1a; npm run dev 开始整合 element-plus npm install element-plus --save npm install unplugin-vue-components unplugin vitejs/plugin-vue --save-dev 修改main.ts import { createApp } from vue import ./style.cs…

【AI 测试】测试用例设计:人工智能语言大模型性能测试用例设计

目录 一、性能测试可视化架构图 &#xff08;1&#xff09;测试整体架构图 &#xff08;2&#xff09;测试体系架构图 &#xff08;3&#xff09;测试流程时序图 二、性能测试架构总览 &#xff08;1&#xff09;性能测试功能点 &#xff08;2&#xff09;测试环境要…

Windsurf SWE-1模型评析:软件工程的AI革命

引言 软件开发领域正经历着前所未有的变革&#xff0c;AI辅助编程工具层出不穷&#xff0c;但大多数仅专注于代码生成这一环节。Windsurf公司近期推出的SWE-1系列模型打破了这一局限&#xff0c;首次将AI应用扩展至软件工程的全流程。这一举措不仅反映了行业对AI工具认知的深化…

Qt for OpenHarmony 编译鸿蒙调用的动态库

简介 Qt for Harmony​ 是跨平台开发框架 ​Qt​ 与华为 ​OpenHarmony​ 操作系统的深度集成方案&#xff0c;由 Qt Group 与华为联合推动。其核心目标是为开发者提供一套高效工具链&#xff0c;实现 ​​“一次开发&#xff0c;多端部署”​&#xff0c;加速 OpenHarmony 生…

退休时,按最低基数补缴医疗保险15年大概需要多少钱

在南京退休时&#xff0c;如果医保缴费年限不足&#xff08;男需满25年/女需满20年&#xff09;&#xff0c;需补缴差额年限。若按最低基数一次性补缴15年医保&#xff0c;费用估算如下&#xff08;以2024年政策为例&#xff09;&#xff1a; 一、补缴金额计算公式 总补缴费用…

wireshark过滤显示rtmp协议

wireshark中抓包显示的数据报文中&#xff0c;明明可以看到有 rtmp 协议的报文&#xff0c;但是过滤的时候却显示一条都没有 查看选项中的配置&#xff0c;已经没有 RTMP 这个协议了&#xff0c;已经被 RTMPT 替换了&#xff0c;过滤框中输入 rtmpt 过滤即可

《哈希表》K倍区间(解题报告)

文章目录 零、题目描述一、算法概述二、算法思路三、代码实现四、算法解释五、复杂度分析 零、题目描述 题目链接&#xff1a;K倍区间 一、算法概述 计算子数组和能被k整除的子数组数量的算法。通过前缀和与哈希表的结合&#xff0c;高效地统计满足条件的子数组。  需要注…

OpenShift 在 Kubernetes 多出的功能中,哪些开源?

OpenShift 在 Kubernetes 基础上增加的功能中&#xff0c;部分组件是开源的&#xff08;代码可公开访问&#xff09;&#xff0c;而另一些则是 Red Hat 专有&#xff08;闭源&#xff09;。以下是详细分类&#xff1a; 1. 完全开源的功能&#xff08;代码可查&#xff09; 这些…