網站首頁 編程語言 正文
bind 是什么?
bind 顧名思義: 綁定
通俗來講呢,可以這么理解有點像函數指針的意思。
資料上是這么講的:可以將 bind 函數看做一個通用函數的適配器,它接受一個可調用對象,生成一個新的可以調用對象來“適應”原對象參數列表
它一般調用形式:
// 其中 newCallable 是一個可調用的對象, arg_list 是以逗號分隔的參數列表 // 這時我們調用 newCallable,newCallable 就會調用 callable, 并用 arg_list 傳遞參數 auto newCallable = bind(callable, arg_list);
好了,重點在于 arg_list 里,那么我們如何傳入參數呢
它們是靠這些參數的位置來識別的,形如 _n 之類的, n 是整形, _1 是第一個參數,_2是第二個參數,以此類推。
而名字 _n 是定義在 placeholders 命名空間中, 而 placeholders 本身又定義在 std 命名空間中, 所以形如:
using std:: placeholders::_1
接下來,我們舉例幾個列子
舉個栗子
bind 是在頭文件 #include <functional>
中, 首先要包含它。
1. bind 無參數的普通函數
#include <iostream> #include <functional> // 包含此頭文件 // 普通函數 void Fun() { std::cout << "I am Fun!" << std::endl; } // 主函數 int main() { auto fun = std::bind(Fun); // 適配 Fun 函數并返回一個可調用的對象 fun(); return 0; }
調試結果:
2. bind 1個參數的普通函數
#include <iostream> #include <functional> // 包含此頭文件 // 普通函數 void Fun(int a) { std::cout << "I am Fun! a = " << a <<std::endl; } // 主函數 int main() { auto fun = std::bind(Fun, std::placeholders::_1); fun(5); return 0; }
調試結果:
3. bind 多個參數的普通函數
#include <iostream> #include <functional> // 包含此頭文件 // 普通函數 int Fun(int a, int b) { return a - b; } // 主函數 int main() { auto fun = std::bind(Fun, std::placeholders::_1, std::placeholders::_2); std::cout << fun(5, 2) << std::endl; return 0; }
調試結果:
4. bind 多個參數的普通函數并打亂參數位置
#include <iostream> #include <functional> // 包含此頭文件 // 普通函數 int Fun(int a, int b) { return a - b; } // 主函數 int main() { auto fun1 = std::bind(Fun, std::placeholders::_1, std::placeholders::_2); auto fun2 = std::bind(Fun, std::placeholders::_2, std::placeholders::_1); std::cout << fun1(5, 2) << std::endl; std::cout << fun1(5, 2) << std::endl; return 0; }
調試結果:
5. bind 類的成員函數
#include <iostream> #include <functional> // 包含此頭文件 class MyClass { public: MyClass() {} ~MyClass() {} public: void printInfo() { std::cout << "MyClass Info." << std::endl; } }; // 主函數 int main() { MyClass A; auto fun = std::bind(&MyClass::printInfo, A); fun(); return 0; }
調試結果:
再舉個應用栗子
#include <iostream> #include <functional> // 包含此頭文件 typedef std::function<void(int)> CallbackType; // A 類 class MyClassA { public: void regeditCallBack(CallbackType fun) { _callback_fun = fun; } void printInfoA(int d) { _callback_fun(d); } private: CallbackType _callback_fun; }; // B 類 class MyClassB { public: void printInfoB(int d) { std::cout << d << std::endl; } }; // 主函數 int main() { MyClassB B; auto funB = std::bind(&MyClassB::printInfoB, B, std::placeholders::_1); MyClassA A; A.regeditCallBack(funB); A.printInfoA(1); return 0; }
調試結果:
原文鏈接:https://www.cnblogs.com/lvvou/p/15682910.html
相關推薦
- 2022-08-20 Docker容器修改端口映射的實現_docker
- 2022-04-03 Python?數據可視化實現5種炫酷的動態圖_python
- 2023-07-08 el-radio-group選中后再次點擊取消,及el-radio-button具有邊框懸浮問題解決
- 2022-08-10 Go?modules?replace解決Go依賴引用問題_Golang
- 2022-10-28 Redis?RESP?協議實現實例詳解_Redis
- 2023-09-18 element-plus 字體變色之cell-style
- 2022-05-29 C#使用DirectX.DirectSound播放語音_C#教程
- 2023-01-15 關于networkx返回圖的鄰接矩陣問題_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支