C 標準庫bind函式知一二

2021-10-05 02:17:01 字數 2257 閱讀 5345

對可呼叫物件(函式指標,仿函式,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 既然函式物件與函式指標在使用方式上沒什麼區別,那為什麼要用函式...