C++ std::bind用法詳解
一、介紹
C++11中提供了std::bind
。bind()函數(shù)的意義就像它的函數(shù)名一樣,是用來綁定函數(shù)調(diào)用的某些參數(shù)的。
bind的思想實際上是一種延遲計算的思想,將可調(diào)用對象保存起來,然后在需要的時候再調(diào)用。而且這種綁定是非常靈活的,不論是普通函數(shù)、函數(shù)對象、還是成員函數(shù)都可以綁定,而且其參數(shù)可以支持占位符,比如你可以這樣綁定一個二元函數(shù):
auto f = bind(&func, std::placeholders::_1, std::placeholders::_2);
調(diào)用的時候通過f(1,2)實現(xiàn)調(diào)用。所以,我們可簡單的認(rèn)為std::bind
就是std::bind1st
和std::bind2nd
的加強版。
std::bind函數(shù)有兩種函數(shù)原型,定義如下:
template< class F, class... Args > /*unspecified*/ bind( F&& f, Args&&... args ); template< class R, class F, class... Args > /*unspecified*/ bind( F&& f, Args&&... args );
Parameters
f | - | Callable object (function object, pointer to function, reference to function, pointer to member function, or pointer to data member) that will be bound to some arguments |
args | - | list of arguments to bind, with the unbound arguments replaced by the placeholders _1, _2, _3... of namespace std::placeholders |
二、實例
這里要先學(xué)習(xí)仿函數(shù)。請參考仿函數(shù)的使用
實例1
#include <iostream> #include <functional> using namespace std; int TestFunc(int a, char c, float f) { cout << a << endl; cout << c << endl; cout << f << endl; return a; } int main() { auto bindFunc1 = bind(TestFunc, std::placeholders::_1, 'A', 100.1); bindFunc1(10); //等于TestFunc(10,'A', 100.1) cout << "=================================\n"; auto bindFunc2 = bind(TestFunc, std::placeholders::_2, std::placeholders::_1, 100.1); bindFunc2('B', 10); //等于TestFunc(10,'B', 100.1) cout << "=================================\n"; auto bindFunc3 = bind(TestFunc, std::placeholders::_2, std::placeholders::_3, std::placeholders::_1); bindFunc3(100.1, 30, 'C'); //等于TestFunc(30,'C', 100.1) return 0; }
上面這段代碼主要說的是bind中std::placeholders的使用。 std::placeholders是一個占位符。當(dāng)使用bind生成一個新的可調(diào)用對象時,std::placeholders表示新的可調(diào)用對象的第 幾個參數(shù)和原函數(shù)的第幾個參數(shù)進行匹配。
auto bindFunc3 = bind(TestFunc, std::placeholders::_2, std::placeholders::_3, std::placeholders::_1); bindFunc3(100.1, 30, 'C');
可以看到,在bind的時候,第一個位置是TestFunc,除了這個,參數(shù)的第一個位置為占位符std::placeholders::_2,這就表示,調(diào)用bindFunc3的時候,它的第二個參數(shù)——即30,和TestFunc的第一個參數(shù)匹配,所以std::placeholders::_2為30,以此類推,最后,實際執(zhí)行的是TestFunc(30,'C', 100.1)。
實例2
#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; // for _1, _2, _3... // demonstrates argument reordering and pass-by-reference int n = 7; // (_1 and _2 are from std::placeholders, and represent future // arguments that will be passed to f1) auto f1 = std::bind(f, _2, 42, _1, std::cref(n), n); n = 10; f1(1, 2, 1001); // 1 is bound by _1, 2 is bound by _2, 1001 is unused // makes a call to f(2, 42, 1, n, 7) // nested bind subexpressions share the placeholders auto f2 = std::bind(f, _3, std::bind(g, _3), _3, 4, 5); f2(10, 11, 12); // makes a call to f(12, g(12), 12, 4, 5); // bind to a pointer to member function Foo foo; auto f3 = std::bind(&Foo::print_sum, &foo, 95, _1); f3(5); // bind to a pointer to data member auto f4 = std::bind(&Foo::data, _1); std::cout << f4(foo) << '\n'; std::cout << f4(std::make_shared<Foo>(foo)) << '\n' << f4(std::make_unique<Foo>(foo)) << '\n'; return 0; }
參考:
https://en.cppreference.com/w/cpp/utility/functional/bind
https://blog.csdn.net/qq_37653144/article/details/79285221
https://blog.csdn.net/u013654125/article/details/100140328#commentBox
到此這篇關(guān)于C++ std::bind用法詳解的文章就介紹到這了,更多相關(guān)C++ std::bind用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows 環(huán)境下使用 Qt 連接 MySQL
這篇文章主要介紹了Windows 環(huán)境下使用 Qt 連接 MySQL的相關(guān)資料,需要的朋友可以參考下2017-07-07C語言數(shù)據(jù)結(jié)構(gòu)之學(xué)生信息管理系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細(xì)介紹了C語言數(shù)據(jù)結(jié)構(gòu)之學(xué)生信息管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11C語言靜態(tài)版通訊錄的設(shè)計與實現(xiàn)
靜態(tài)版通訊錄是一種簡單的通訊錄實現(xiàn)方式,通過定義固定的數(shù)組大小來存儲聯(lián)系人信息。該方法不支持動態(tài)增刪聯(lián)系人,但具有實現(xiàn)簡單、易于理解的優(yōu)點。在程序設(shè)計中,需注意數(shù)組邊界溢出等問題2023-04-04C++初學(xué)者之根據(jù)輸入的任何一個正整數(shù),輸出可能被表示的連續(xù)正整數(shù)
這篇文章主要介紹了C++初學(xué)者之根據(jù)輸入的任何一個正整數(shù),輸出可能被表示的連續(xù)正整數(shù)的相關(guān)資料,需要的朋友可以參考下2016-03-03