<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
C++11中的
std::function
和std::bind
是函數物件的重要組成部分,它們可以用於將函數和引數繫結在一起,形成一個可呼叫的物件。std::function
可以儲存任意可呼叫物件,包括函數指標、函數物件、lambda表示式等,而std::bind
則可以將函數和引數繫結在一起,形成一個新的可呼叫物件。它們的使用可以大大簡化程式碼,提高程式碼的可讀性和可維護性。
C++中有如下幾種可呼叫物件,
函數、函數指標、lambda表示式、bind物件、函數物件
。
其中,lambda表示式和bind物件是C++11標準中提出的(bind機制並不是新標準中首次提出,而是對舊版本中bind1st和bind2st的合併)。
std::function是一個可呼叫物件包裝器,是一個類別範本,可以容納除了類成員函數指標之外的所有可呼叫物件,它可以用統一的方式處理常式、函數物件、函數指標,並允許儲存和延遲它們的執行。
使用std::function可以實現回撥函數、事件處理等功能。
#include <functional> template<class R, class... Args> class function<R(Args...)>; //其中,R 表示返回值型別,Args... 表示引數型別列表。 //例如,function<int(float, double)> 表示一個返回值為 int,接受一個 float 和一個 double 型別引數的函數物件。
//例如,定義一個返回值為int,引數為兩個int的函數物件: std::function<int(int, int)>func; //可以將一個函數指標或lambda表示式賦值給函數物件: int add(int a, int b) { return a +b; } func = add; // 函數指標賦值 func = [](int a, int b) { return a + b; };// lambda表示式賦值 //呼叫函數物件可以使用operator(),例如: int result = func(1, 2); // 呼叫add函數,返回3
可以方便地實現回撥函數、事件處理等功能,同時也可以用於實現函數物件的封裝和傳遞。
它的使用會帶來一定的效能開銷,因為它需要在執行時進行型別檢查和動態分配記憶體。
此外,如果使用不當,也容易引起記憶體漏失和物件生命週期管理的問題。
std::function是一個可呼叫物件包裝器,是一個類別範本,可以容納除了類成員函數指標之外的所有可呼叫物件,它可以用統一的方式處理常式、函數物件、函數指標,並允許儲存和延遲它們的執行。
template<class F, class... Args> /unspecified/ bind(F&& f, Args&&... args); //其中,F是要繫結的函數物件,Args是要繫結的引數。返回值是一個新的可呼叫物件,可以直接呼叫或者儲存起來後再呼叫。
例如,我們有一個函數物件:void foo(int a, int b, int c) { std::cout << a << " " << b << " " << c << std::endl; }
我們可以使用std::bind將它繫結到一些引數上:auto f = std::bind(foo, 1, 2, 3);
這裡,f是一個新的可呼叫物件,它繫結了foo函數和引數1、2、3。我們可以像呼叫原始函數物件一樣呼叫它:f(); // 輸出:1 2 3
我們也可以只繫結部分引數:auto g = std::bind(foo, 1, std::placeholders::_1, 3);
這裡,std::placeholders::_1表示預留位置,它表示在呼叫g時,第二個引數會被傳遞給foo函數。我們可以這樣呼叫g:g(2); // 輸出:1 2 3
這就是std::bind的基本用法。它可以方便地將函數物件和引數繫結在一起,生成一個新的可呼叫物件。
優點:
可以方便地實現函數物件的複用和引數的延遲繫結,從而提高程式碼的可讀性和可維護性。
缺點:
可能會導致程式碼的複雜性增加,特別是當引數較多時,需要謹慎使用。
程式碼範例
#pragma once #include <iostream> #include <functional> class A { public: bool TESTA(int, char*, int) { /* implementation */ } }; class B { public: bool TESTB(std::function<bool(int, char*, int)> func) { /* implementation */ } }; int main() { A objA; B objB; auto lambda = [](int a, char* b, int c) { /* implementation */ }; objB.TESTB(lambda); objB.TESTB(std::bind(&A::TESTA, &objA, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); return 0; }
到此這篇關於C++11 std::function和std::bind 的使用的文章就介紹到這了,更多相關C++11 std::function和std::bind內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45