C bind函式相關

2021-09-28 11:02:56 字數 1765 閱讀 1010

標準庫bind函式

bind函式可以看作乙個通用的函式介面卡,它接受乙個可呼叫物件,生成乙個新的可呼叫物件來"適應"原物件的引數列表。

呼叫bind的一般形式為:

auto newcallable = bind(callable,arg_list);

其中,newcallabe本身是乙個可呼叫物件,arg_list是乙個逗號分隔的引數列表,對應給定的newcallable的引數。即,當我們呼叫newcallable時,newcallable會呼叫callable,並傳給它arg_list中的引數。

arg_list中的引數可能包含形如_n的名字,其中n手機乙個整數。這些引數是"佔位符",表示newcallable的引數,它們佔據了傳遞給newcallable的引數的"位置"。數值n表示生成的可呼叫物件中引數的位置:_1為newcallable中的第乙個引數,_2為第二個引數,以此類推。

舉個例子。

//check是乙個可呼叫物件,接受乙個string型別的引數

//並用此string和值6來呼叫

check_tmp auto check = bind(check_tmp,_1,6);

此bind只有乙個佔位符,表示check只接受單一引數。佔位符出現在arg_list的第乙個位置,表示check的此引數對應check_tmp的第乙個引數,此引數是乙個const string。因此,呼叫check必須傳給它乙個string型別的引數,check會將此引數傳遞給check_tmp。

string s = "hello world"; bool t = check(s); 

//check(s)會呼叫check_tmp(s,6)

使用placeholders名字

名字_n都定義在乙個名為placeholders的命名空間中,而這個命名空間本身定義在std命名空間中。為了使用這些名字,兩個命名空間都要寫上。

舉個例子。

using std::placeholders::_1;

這樣很麻煩。

簡化一下。

using namespace std::placeholders;

bind的引數

直接舉例子。

//g是乙個由兩個引數的可呼叫物件 

auto g = bind(f,a,b,_2,c,_1);

//當我們呼叫

g(x,y);

//對映為

f(a,b,y,c,_x);

//是會改變引數順序的

繫結引用引數

預設情況下,bind的那些不是佔位符的引數被拷貝到bind返回的可呼叫物件中。不過有些繫結的引數我們希望以引用方式傳遞,或是要繫結的引數的型別無法拷貝。

舉個例子。

ostream &print(ostream &os,const string &s,char c){ return os 《但是,不能直接用bind來代替對os的捕獲:

//錯誤,不能拷貝os

bind(print,os,_1,' ');

原因在於bind拷貝其引數,而我們不能拷貝乙個ostream。如果我們希望傳遞給bind乙個物件又不拷貝它,就必須使用標準庫ref函式:

bind(print,ref(os),_1," ");
函式ref返回乙個物件,包含給定的引用,此物件是可以拷貝的。

R檔案拼接函式cbind 和rbind

可以利用函式cbind 和rbind 把向量和矩陣拼成乙個新的矩陣。概略地說,cbind 把矩陣橫向合併成乙個大矩陣 列方式 而rbind 是縱向合併 行方式 cbind 根據列進行合併,即疊加所有列,m列的矩陣與n列的矩陣cbind 最後變成m n列,合併前提 cbind a,b 中矩陣a b的行...

bind函式返回值 1 C bind詳解

給cpp開發者加星標,提公升c c 技能 可將std bind函式看作乙個通用的函式介面卡,它接受乙個可呼叫物件,生成乙個新的可呼叫物件來 適應 原物件的引數列表。std bind將可呼叫物件與其引數一起進行繫結,繫結後的結果可以使用std function儲存。以下是正文 先將可呼叫的物件儲存起來...

c bind的簡單使用 例項

bind是繫結,我接觸過的高階語言js swift中也有類似的應用。乙個函式把另乙個函式作為引數。下面是我的demo,執行完,就知道是怎麼回事了。void func int i,int j,int x,int y auto f bind bind func,10,20 2,1 intmain 執行結...