C++11新特性之七:bind和function
一.std::bind
bind是這樣一種機(jī)制,它可以將參數(shù)綁定于可調(diào)用對(duì)象,產(chǎn)生一個(gè)新的可調(diào)用實(shí)體,這種機(jī)制在函數(shù)回調(diào)時(shí)頗為有用。C++98中,有兩個(gè)函數(shù)bind1st和bind2nd,它們分別用來(lái)綁定functor的第一個(gè)和第二個(gè)參數(shù),都只能綁定一個(gè)參數(shù)。C++98提供的這些特性已經(jīng)由于C++11的到來(lái)而過(guò)時(shí),由于各種限制,我們經(jīng)常使用bind而非bind1st和bind2nd。在C++11標(biāo)準(zhǔn)庫(kù)中,它們均在functional頭文件中。而C++STL很大一部分由Boost庫(kù)擴(kuò)充,STL中的shared_ptr等智能指針,bind及function都是由Boost庫(kù)引入。在寫代碼過(guò)程中,要養(yǎng)成使用bind,function,lambda和智能指針的習(xí)慣,它們非常強(qiáng)大簡(jiǎn)潔實(shí)用。
1.過(guò)時(shí)的bind1st和bind2nd
bind1st(op, arg) :op(arg, param)?
bind2nd(op, arg) :op(param, arg)
vectorcoll?{1,?2,?3,?4,?5,?11,?22,?5,?12}; //?查找第一個(gè)元素值大于10的元素 std::find_if(coll.begin(),?coll.end(),?//?范圍 ?????????????std::bind2nd(std::greater(),?10));//?將10綁定到第二個(gè)參數(shù),也就是?......大于10 //?查找元素值大于10的元素的個(gè)數(shù) int?_count?=?count_if(coll.begin(),?coll.end(),?//?范圍 ??????????????std::bind1st(less(),?10));//?將10綁定到第一個(gè)參數(shù),也就是10小于......
2. C++11中的std::bind
//function?object內(nèi)部調(diào)用plus<>(也就是operator+),以占位符(placeholders)_1為第一個(gè)參數(shù), //以10為第二個(gè)參數(shù),占位符_1表示實(shí)際傳入此表達(dá)式的第一實(shí)參,返回“實(shí)參+10”的結(jié)果值 auto?plus10?=?std::bind(std::plus(),?std::placeholders::_1,?10); std::cout?<<?plus10(7)?<<?std::endl;//?輸出17
//?(x?+?10)*2,下面的代碼中x=7 std::bind(std::multiplies(),? ??????????std::bind(std::plus(),?std::placeholders::_1,?10),//?i+10 ??????????2)(7);
注意:上面所用的less