c++bind和forward完美轉化


前言

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; 這些…