網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
除了容器有適配器之外,其實(shí)函數(shù)也提供了適配器,適配器的特點(diǎn)就是將一個(gè)類型改裝成為擁有子集功能的新的類型。其中函數(shù)的適配器典型的就是通過(guò)std::bind
來(lái)實(shí)現(xiàn)。
std::bind函數(shù)定義在頭文件functional中,是一個(gè)函數(shù)模板,它就像一個(gè)函數(shù)適配器,接受一個(gè)可調(diào)用對(duì)象(callable object),生成一個(gè)新的可調(diào)用對(duì)象來(lái)“適應(yīng)”原對(duì)象的參數(shù)列表。一般而言,我們用它可以把一個(gè)原本接收N個(gè)參數(shù)的函數(shù)fn,通過(guò)綁定一些參數(shù),返回一個(gè)接收M個(gè)(M可以大于N,但這么做沒(méi)什么意義)參數(shù)的新函數(shù)。同時(shí),使用std::bind函數(shù)還可以實(shí)現(xiàn)參數(shù)順序調(diào)整等操作。
如可調(diào)用 (Callable) 中描述,調(diào)用指向非靜態(tài)成員函數(shù)指針或指向非靜態(tài)數(shù)據(jù)成員指針時(shí),首參數(shù)必須是引用或指針(可以包含智能指針,如 std::shared_ptr 與 std::unique_ptr),指向?qū)⒃L問(wèn)其成員的對(duì)象。
#include <random> #include <iostream> #include <memory> #include <functional> void f(int n1, int n2, int n3, const int& n4, int n5) { std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << ' ' << n5 << '\n'; } int g(int n1) { return n1; } struct Foo { void print_sum(int n1, int n2) { std::cout << n1+n2 << '\n'; } int data = 10; }; int main() { using namespace std::placeholders; // 對(duì)于 _1, _2, _3... // 演示參數(shù)重排序和按引用傳遞 int n = 7; // ( _1 與 _2 來(lái)自 std::placeholders ,并表示將來(lái)會(huì)傳遞給 f1 的參數(shù)) auto f1 = std::bind(f, _2, 42, _1, std::cref(n), n); n = 10; f1(1, 2, 1001); // 1 為 _1 所綁定, 2 為 _2 所綁定,不使用 1001 // 進(jìn)行到 f(2, 42, 1, n, 7) 的調(diào)用 // 嵌套 bind 子表達(dá)式共享占位符 auto f2 = std::bind(f, _3, std::bind(g, _3), _3, 4, 5); f2(10, 11, 12); // 進(jìn)行到 f(12, g(12), 12, 4, 5); 的調(diào)用 // 常見(jiàn)使用情況:以分布綁定 RNG std::default_random_engine e; std::uniform_int_distribution<> d(0, 10); std::function<int()> rnd = std::bind(d, e); // e 的一個(gè)副本存儲(chǔ)于 rnd for(int n=0; n<10; ++n) std::cout << rnd() << ' '; std::cout << '\n'; // 綁定指向成員函數(shù)指針 Foo foo; auto f3 = std::bind(&Foo::print_sum, &foo, 95, _1); f3(5); // 綁定指向數(shù)據(jù)成員指針 auto f4 = std::bind(&Foo::data, _1); std::cout << f4(foo) << '\n'; // 智能指針亦能用于調(diào)用被引用對(duì)象的成員 std::cout << f4(std::make_shared<Foo>(foo)) << '\n' << f4(std::make_unique<Foo>(foo)) << '\n'; }
輸出:
2 42 1 10 7
12 12 12 4 5
1 5 0 2 0 8 2 2 10 8
100
10
10
10
原文鏈接:https://www.cnblogs.com/xutopia/archive/2022/01/05/15768939.html
相關(guān)推薦
- 2022-11-08 Go中init()執(zhí)行順序詳解_Golang
- 2022-07-13 Springboot 項(xiàng)目中使用 @RestControllerAdvice 注解不生效
- 2023-01-08 Android?Application的使用全面解析_Android
- 2022-03-23 詳細(xì)聊聊Redis的過(guò)期策略_Redis
- 2022-12-21 Android開(kāi)發(fā)ThreadPoolExecutor與自定義線程池詳解_Android
- 2022-11-18 詳解Rust中三種循環(huán)(loop,while,for)的使用_Rust語(yǔ)言
- 2024-03-18 JedisDataException: READONLY You can‘t write again
- 2022-05-16 .Net?MVC將Controller數(shù)據(jù)傳遞到View_實(shí)用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支