您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++11 std::function和std::bind如何使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++11 std::function和std::bind如何使用文章都會有所收獲,下面我們一起來看看吧。
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 類型參數的函數對象。
對C++中各種可調用實體(普通函數、Lambda表達式、函數指針、以及其它函數對象等)的封裝,形成一個新的可調用的std::function對象,簡化調用;
對C++中現有的可調用實體的一種類型安全的包裹(如:函數指針這類可調用實體,是類型不安全的)。
將函數作為參數傳遞給其他函數;
將函數作為返回值返回;
將函數對象作為參數傳遞給其他函數;
將函數對象作為返回值返回。
//例如,定義一個返回值為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是要綁定的參數。返回值是一個新的可調用對象,可以直接調用或者存儲起來后再調用。
將可調用對象和其參數綁定成一個仿函數;
只綁定部分參數,減少可調用對象傳入的參數。
綁定函數對象的參數,生成一個新的可調用對象,可以方便地將函數對象作為參數傳遞給其它函數。
可以將成員函數綁定到對象上,生成一個新的可調用對象,方便地調用成員函數。
可以將成員函數綁定到對象指針上,生成一個新的可調用對象,方便地調用成員函數。
可以將成員函數綁定到對象引用上,生成一個新的可調用對象,方便地調用成員函數。
可以將函數對象綁定到函數指針上,生成一個新的可調用對象,方便地調用函數對象。
可以將函數對象綁定到函數引用上,生成一個新的可調用對象,方便地調用函數對象。
可以將函數對象綁定到std::function對象上,生成一個新的可調用對象,方便地調用函數對象。
例如,我們有一個函數對象: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如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。