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