C++標準庫bind函數知一二

對可調用對象(函數指針,仿函數,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){
	return str.size()<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){
	out<<s;
	return out;
}
//錯誤,ostream類對象不允許拷貝
auto pr=bind(print,_1,cout);
//正確的做法
auto pr=bind(print,_1,ref(cout));
pr("China")<<endl;

本文到此結束,感謝您的閱讀,如果覺得有幫助可以點個贊吖~
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章