上篇部落格在為大家介紹lambda是先由find_if函式引入問題,由於find_if函式的第三個引數所要求的可呼叫物件只能由乙個謂詞,所以我們最後選擇的解決方法是用lambda表示式。那麼此問題還有其他的解決方法麼?本篇部落格我就為大家帶來新的解決方法bind函式
bind函式的最根本的作用就是可以把乙個引數較多的函式給封裝成引數較少的函式,因此對於上述find_if函式的問題,我們可以自定義乙個含倆個引數的函式,然後通過bind函式進行封裝,使之變成含乙個引數的新函式(新函式會呼叫原來的函式),這樣新函式就可以被find_if函式的第三個引數所使用了
bind函式定義在標頭檔案functional中,我們可以將bind函式看作乙個通用的函式介面卡,它的一般形式如下
auto newfun = bind(oldfun,arg_list);
引數oldfun是需要bind封裝的源函式,newfun是封裝了引數後的old_fun,arg_list是乙個逗號分割的引數列表,對應oldfun的引數,即當我們呼叫newfun是,它會呼叫oldfun並且會把引數列表中的引數傳給oldfun
arg_list中會包含_n的名字,此類名字的引數又名」佔位符」,因為其佔據了newcallable的引數的位置,其中_n中的n表示它佔據了new_fun函式中的第幾個引數。
函式的基本形式介紹完了,那麼就進入整體,來為大家展示乙個bind函式在解決find_if問題上是如何做的
例項如下
#include
#include
#include
#include
using
namespace
std;
bool check_size(const
int x,int sz)
int main(void)
; int n = 5;
//有bind函式新封裝生成的函式,其內部呼叫了check_size
auto new_check_size = bind(check_size,std::placeholders::_1,n);
auto it = find_if(v.begin(),v.end(),new_check_size);
cout
<<"第乙個大於n的數為:"
<<*it0;}
用bind重排源函式的引數順序只需將新函式與源函式的引數列表進行跌倒即可
實現**如下
//假定源函式如下
bool oldfun(int a1,int a2);
//使用bind封裝源函式如下
auto newfun = bind(old_fun,_2,_1);
如果我們想像lambda表示式一樣傳遞引用,那麼就得使用標準庫中的ref函式,與其類似的是cref其生成的引用是const型別的
具體例項如下
#include
#include
#include
#include
using
namespace
std;
bool check_size(const
int x,int &sz)
int main(void)
; int n = 5;
//傳遞n的引用
auto new_check_size = bind(check_size,std::placeholders::_1,ref(n));
auto it = find_if(v.begin(),v.end(),new_check_size);
cout
<<"n的值為為:"
0;}
標準庫bind函式
1.作用 bind可以看做乙個函式介面卡,它接受乙個可呼叫物件,生成乙個新的可呼叫物件來適應原物件的引數列表。2.語法auto newcallable bind callable,arg list arg list是乙個逗號分割的引數列表,對應給定的callable引數。當我們呼叫newcallab...
C 標準庫bind函式知一二
對可呼叫物件 函式指標,仿函式,lambda表示式等 進行引數繫結,c 11提供了名為bind的標準庫函式,它定義在標頭檔案functional中。bind函式可以看作是乙個通用的函式介面卡,它可以接受乙個可呼叫物件,生成乙個新的可呼叫物件來 適應 原物件的引數列表。呼叫bind的一般形式為 aut...
c 之函式物件 bind函式
函式物件實質上是乙個實現了operator 括號操作符 的類。class add intmain 函式指標版本就是 int addfunc int a,int b typedef int add int a,int b int main 既然函式物件與函式指標在使用方式上沒什麼區別,那為什麼要用函式...