對可呼叫物件(函式指標,仿函式,lambda表示式等)進行引數繫結,c++11提供了名為bind的標準庫函式,它定義在標頭檔案functional中。
bind函式可以看作是乙個通用的函式介面卡,它可以接受乙個可呼叫物件,生成乙個新的可呼叫物件來"適應"原物件的引數列表。
呼叫bind的一般形式為:auto newcallable = bind(callable, arg_list)
其中,newcallable本身是乙個可呼叫物件,arg_list是乙個逗號分隔的引數列表(形如arg1,arg2,arg3,…),對應給定的callable的引數。
當我們呼叫newcallable時,newcallabele會呼叫 callable,並傳遞給它arg_list中引數。
arg_list中的可能存在形如_n(n為自然整數)的佔位符,這些佔位符表示newcallable的引數,它們佔據了傳遞給newcallable的引數的「位置」。
例如 _1為newcallable的第乙個引數,_2為第二個引數,以此類推。
note:名字_n都定義在乙個名為placeholders的命名空間中,而這個命名空間本身又定義在std命名空間中,所有需要先宣告才能使用。
可以使用以下幾種宣告:
1、using std::placeholders::_n; //n為1 2 3 4 5 …
2、using namespace std::placeholders; //推薦
看了這麼多文字,相信你和我一樣一頭霧水,讓我們來看個簡單的例子:
bool
findstr
(const string &str,string::size_type length)
//str5是乙個新的可呼叫物件,接受乙個constr string &或者string &型別引數
auto str5=
bind
(findstr,_1,5)
;string s1
("china");
string s2
("chinese");
//str5(s1)會呼叫findstr(s1,5),返回false
auto result1 =
str5
(s1)
//str5(s2)會呼叫findstr(s2,5),返回false
auto result2 =
str5
(s2)
看完例子再結合上面描述是不是感覺豁然開朗呢,bind也不過如此,哈哈哈,別急,下面還有。
除此之外,bind函式還可以將引數重新安排順序,例如f是乙個可呼叫物件,它有5個引數,則下面對bind的呼叫:
//f接受5個引數
void
f(a,b,c,d,e)
;//生成新的可呼叫物件,它有三個引數,分別用佔位符_3,_2,_1表示
auto g =
bind
(f,a,_3,b,_1,_2)
;//相當於呼叫f(a,z,b,x,y)
g(x,y,z)
;
預設情況下,bind採用值傳遞的方式,當我們希望以引用方式傳遞或者繫結的引數的型別無法拷貝時,則必須使用標準庫ref函式,該函式可以生成乙個引用,而cref函式生成乙個const引用,兩函式都定義在標頭檔案functional中
ostream &
print
(const string &s,ostream &out)
//錯誤,ostream類物件不允許拷貝
auto pr=
bind
(print,_1,cout)
;//正確的做法
auto pr=
bind
(print,_1,
ref(cout));
pr("china"
)<
C 標準庫bind函式
上篇部落格在為大家介紹lambda是先由find if函式引入問題,由於find if函式的第三個引數所要求的可呼叫物件只能由乙個謂詞,所以我們最後選擇的解決方法是用lambda表示式。那麼此問題還有其他的解決方法麼?本篇部落格我就為大家帶來新的解決方法bind函式 bind函式的最根本的作用就是可...
標準庫bind函式
1.作用 bind可以看做乙個函式介面卡,它接受乙個可呼叫物件,生成乙個新的可呼叫物件來適應原物件的引數列表。2.語法auto newcallable bind callable,arg list arg list是乙個逗號分割的引數列表,對應給定的callable引數。當我們呼叫newcallab...
c 之函式物件 bind函式
函式物件實質上是乙個實現了operator 括號操作符 的類。class add intmain 函式指標版本就是 int addfunc int a,int b typedef int add int a,int b int main 既然函式物件與函式指標在使用方式上沒什麼區別,那為什麼要用函式...