[C++]C++11:Function与Bind
std::function
它是函數(shù)、函數(shù)對(duì)象、函數(shù)指針、和成員函數(shù)的包裝器,可以容納任何類型的函數(shù)對(duì)象,函數(shù)指針,引用函數(shù),成員函數(shù)的指針。
以統(tǒng)一的方式處理函數(shù)、函數(shù)對(duì)象、函數(shù)指針、和成員函數(shù)。
允許保存和延遲執(zhí)行函數(shù)。
函數(shù)和成員函數(shù)作為function
void G(); struct A { void H(){} };std::function<void()> f = G; //全局函數(shù)A a; std::function<void()> f 1= std::bind(&A::H, a); //成員函數(shù)可以用function取代函數(shù)指針。因?yàn)樗梢员4婧瘮?shù)延遲執(zhí)行,所以比較適合作為回調(diào)函數(shù),也可以把它看做類似于c#中特殊的委托,只有一個(gè)成員的委托。
struct A { A(std::function<void()>& f):m_callback(f) void Notify() { m_callback();//回調(diào)到上層 }std::function<void()> m_callback; }function還可以作為函數(shù)入?yún)?#xff0c;這樣可以在函數(shù)外部控制函數(shù)的內(nèi)部行為了,讓我們的函數(shù)變得更加靈活。
void Foo(int x, std::function<void(int)>& f) { if(x%2==0) f(x); }void G(int x) { cout<<x<<endl; }void H(int x) { cout<<x+2<<endl; }void TestFoo() { auto f = std::bind(G, std::placeholders::_1); Foo(4, f);//在Foo函數(shù)外面更改f的行為 f = std::bind(H, std::placeholders::_1); Foo(4, f); }std::bind綁定器
將函數(shù)、成員函數(shù)和閉包轉(zhuǎn)成function函數(shù)對(duì)象
將多元(n>1)函數(shù)轉(zhuǎn)成一元函數(shù)或者(n-1)元函數(shù)。
bind簡(jiǎn)化和增強(qiáng)bind1st和bind2nd
其實(shí)bind簡(jiǎn)化和增強(qiáng)了之前標(biāo)準(zhǔn)庫(kù)中bind1st和bind2nd,它完全可以替代bind1s和bind2st,并且能組合函數(shù)。我們知道bind1st和bind2nd將一個(gè)二元算子轉(zhuǎn)換成一個(gè)一元算子。
本質(zhì)上是對(duì)一個(gè)二元函數(shù)less的調(diào)用,但是它卻要分別用bind1st和bind2nd,而且還要想想到底是用bind1st還是bind2nd,用起來感覺不方便。現(xiàn)在用bind,就可以以統(tǒng)一的方式去實(shí)現(xiàn)了。
bind函數(shù)組合
bind的還有一個(gè)強(qiáng)大之處就是函數(shù)組合。假設(shè)我們要找出集合中大于5小于10的元素個(gè)數(shù)怎么做呢?我們需要一個(gè)邏輯與才能做到類似于:
然后,我們需要另一個(gè)謂詞來回答 _1 是否大于5。
std::bind(std::greater<int>(),_1,5);然后,我們還需要另一個(gè)謂詞來回答 _1 是否小于等于10。
std::bind(std::less_equal<int>(),_1,10);最后,我們需要把它們兩個(gè)用邏輯與合起來,就象這樣:
//查找集合中大于5小于10的元素個(gè)數(shù) auto f = bind(std::logical_and<bool>(), bind(std::greater<int>(),_1,5), bind(std::less_equal<int>(),_1,10)); int count = count_if(coll.begin(), coll.end(), f);c++11中推出function是為了泛化函數(shù)對(duì)象,函數(shù)指針,引用函數(shù),成員函數(shù)的指針,讓我們可以按更統(tǒng)一的方式寫出更加泛化的代碼;推出bind是為了替換和增強(qiáng)之前標(biāo)準(zhǔn)庫(kù)的bind1st和bind2st,讓我們的用起來更方便!
(1)bind預(yù)先綁定的參數(shù)需要傳具體的變量或值進(jìn)去,對(duì)于預(yù)先綁定的參數(shù),是pass-by-value的
(2)對(duì)于不事先綁定的參數(shù),需要傳std::placeholders進(jìn)去,從_1開始,依次遞增。placeholder是pass-by-reference的
(3)bind的返回值是可調(diào)用實(shí)體,可以直接賦給std::function對(duì)象
(4)對(duì)于綁定的指針、引用類型的參數(shù),使用者需要保證在可調(diào)用實(shí)體調(diào)用之前,這些參數(shù)是可用的
(5)類的this可以通過對(duì)象或者指針來綁定
引用:http://www.cnblogs.com/qicosmos/p/3302144.html
轉(zhuǎn)載于:https://www.cnblogs.com/lizhenghao126/p/11053725.html
總結(jié)
以上是生活随笔為你收集整理的[C++]C++11:Function与Bind的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 内置函数(三)日期函数
- 下一篇: linux-常用指令3