您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++11 std::function和std::bind如何使用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C++11 std::function和std::bind如何使用文章都會有所收獲,下面我們一起來看看吧。
C++11中的
std::function
和std::bind
是函數(shù)對象的重要組成部分,它們可以用于將函數(shù)和參數(shù)綁定在一起,形成一個(gè)可調(diào)用的對象。std::function
可以存儲任意可調(diào)用對象,包括函數(shù)指針、函數(shù)對象、lambda表達(dá)式等,而std::bind
則可以將函數(shù)和參數(shù)綁定在一起,形成一個(gè)新的可調(diào)用對象。它們的使用可以大大簡化代碼,提高代碼的可讀性和可維護(hù)性。
C++中有如下幾種可調(diào)用對象,
函數(shù)、函數(shù)指針、lambda表達(dá)式、bind對象、函數(shù)對象
。
其中,lambda表達(dá)式和bind對象是C++11標(biāo)準(zhǔn)中提出的(bind機(jī)制并不是新標(biāo)準(zhǔn)中首次提出,而是對舊版本中bind1st和bind2st的合并)。
std::function是一個(gè)可調(diào)用對象包裝器,是一個(gè)類模板,可以容納除了類成員函數(shù)指針之外的所有可調(diào)用對象,它可以用統(tǒng)一的方式處理函數(shù)、函數(shù)對象、函數(shù)指針,并允許保存和延遲它們的執(zhí)行。
使用std::function可以實(shí)現(xiàn)回調(diào)函數(shù)、事件處理等功能。
#include <functional> template<class R, class... Args> class function<R(Args...)>; //其中,R 表示返回值類型,Args... 表示參數(shù)類型列表。 //例如,function<int(float, double)> 表示一個(gè)返回值為 int,接受一個(gè) float 和一個(gè) double 類型參數(shù)的函數(shù)對象。
對C++中各種可調(diào)用實(shí)體(普通函數(shù)、Lambda表達(dá)式、函數(shù)指針、以及其它函數(shù)對象等)的封裝,形成一個(gè)新的可調(diào)用的std::function對象,簡化調(diào)用;
對C++中現(xiàn)有的可調(diào)用實(shí)體的一種類型安全的包裹(如:函數(shù)指針這類可調(diào)用實(shí)體,是類型不安全的)。
將函數(shù)作為參數(shù)傳遞給其他函數(shù);
將函數(shù)作為返回值返回;
將函數(shù)對象作為參數(shù)傳遞給其他函數(shù);
將函數(shù)對象作為返回值返回。
//例如,定義一個(gè)返回值為int,參數(shù)為兩個(gè)int的函數(shù)對象: std::function<int(int, int)>func; //可以將一個(gè)函數(shù)指針或lambda表達(dá)式賦值給函數(shù)對象: int add(int a, int b) { return a +b; } func = add; // 函數(shù)指針賦值 func = [](int a, int b) { return a + b; };// lambda表達(dá)式賦值 //調(diào)用函數(shù)對象可以使用operator(),例如: int result = func(1, 2); // 調(diào)用add函數(shù),返回3
優(yōu)點(diǎn):
可以方便地實(shí)現(xiàn)回調(diào)函數(shù)、事件處理等功能,同時(shí)也可以用于實(shí)現(xiàn)函數(shù)對象的封裝和傳遞。
缺點(diǎn):
它的使用會帶來一定的性能開銷,因?yàn)樗枰谶\(yùn)行時(shí)進(jìn)行類型檢查和動(dòng)態(tài)分配內(nèi)存。
此外,如果使用不當(dāng),也容易引起內(nèi)存泄漏和對象生命周期管理的問題。
std::function是一個(gè)可調(diào)用對象包裝器,是一個(gè)類模板,可以容納除了類成員函數(shù)指針之外的所有可調(diào)用對象,它可以用統(tǒng)一的方式處理函數(shù)、函數(shù)對象、函數(shù)指針,并允許保存和延遲它們的執(zhí)行。
template<class F, class... Args> /unspecified/ bind(F&& f, Args&&... args); //其中,F(xiàn)是要綁定的函數(shù)對象,Args是要綁定的參數(shù)。返回值是一個(gè)新的可調(diào)用對象,可以直接調(diào)用或者存儲起來后再調(diào)用。
將可調(diào)用對象和其參數(shù)綁定成一個(gè)仿函數(shù);
只綁定部分參數(shù),減少可調(diào)用對象傳入的參數(shù)。
綁定函數(shù)對象的參數(shù),生成一個(gè)新的可調(diào)用對象,可以方便地將函數(shù)對象作為參數(shù)傳遞給其它函數(shù)。
可以將成員函數(shù)綁定到對象上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用成員函數(shù)。
可以將成員函數(shù)綁定到對象指針上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用成員函數(shù)。
可以將成員函數(shù)綁定到對象引用上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用成員函數(shù)。
可以將函數(shù)對象綁定到函數(shù)指針上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用函數(shù)對象。
可以將函數(shù)對象綁定到函數(shù)引用上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用函數(shù)對象。
可以將函數(shù)對象綁定到std::function對象上,生成一個(gè)新的可調(diào)用對象,方便地調(diào)用函數(shù)對象。
例如,我們有一個(gè)函數(shù)對象:void foo(int a, int b, int c) { std::cout << a << " " << b << " " << c << std::endl; }
我們可以使用std::bind將它綁定到一些參數(shù)上:auto f = std::bind(foo, 1, 2, 3);
這里,f是一個(gè)新的可調(diào)用對象,它綁定了foo函數(shù)和參數(shù)1、2、3。我們可以像調(diào)用原始函數(shù)對象一樣調(diào)用它:f(); // 輸出:1 2 3
我們也可以只綁定部分參數(shù):auto g = std::bind(foo, 1, std::placeholders::_1, 3);
這里,std::placeholders::_1表示占位符,它表示在調(diào)用g時(shí),第二個(gè)參數(shù)會被傳遞給foo函數(shù)。我們可以這樣調(diào)用g:g(2); // 輸出:1 2 3
這就是std::bind的基本用法。它可以方便地將函數(shù)對象和參數(shù)綁定在一起,生成一個(gè)新的可調(diào)用對象。
優(yōu)點(diǎn):
可以方便地實(shí)現(xiàn)函數(shù)對象的復(fù)用和參數(shù)的延遲綁定,從而提高代碼的可讀性和可維護(hù)性。
缺點(diǎn):
可能會導(dǎo)致代碼的復(fù)雜性增加,特別是當(dāng)參數(shù)較多時(shí),需要謹(jǐn)慎使用。
代碼示例
#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; }
關(guān)于“C++11 std::function和std::bind如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“C++11 std::function和std::bind如何使用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。