2013-04-23 85 views
5

我有這樣的代碼:的std ::功能和std ::綁定行爲

#include <iostream> 
#include <functional> 
#include <vector> 

void fun() 
{ 
    std::cout<<"fun"; 
} 

void gun(int) 
{ 
    std::cout<<"gun"; 
} 

int main() 
{ 
    std::vector<std::function<void(int)>> vec; 

    vec.push_back(std::bind(fun)); 
    vec.push_back(gun); 

    vec[0](1); 
    vec[1](2); 
} 

能否請你解釋它是如何可能爲std::bind返回std::function<void(int)>結合void()功能時?

如何通過使用void(int)函子來調用void()函數?

+1

就像一個挑剔的人:請在代碼示例中提供所有必要的'#include'語句(vector,iostreams,functional)。使複製粘貼更加方便。 – TemplateRex 2013-04-23 06:37:25

回答

9

function模板參數傳遞的簽名只是決定有多少佔位符(_1)將綁定,並且什麼類型的。

實際函數的調用僅使用綁定函數實際需要的參數數量。實際上,多餘的參數被忽略。 (?)

另外,更有啓發例如,從另一面看這個:

#include <iostream> 
#include <functional> 

void gun(int i) 
{ 
    std::cout<<"gun("<<i<<")"; 
} 

int main() 
{ 
    using namespace std::placeholders; 
    std::bind(gun, _5)("ignore", 3, "and", 4, 43); 
} 

打印

​​
+0

對不起,但這不回答我的問題:如何std :: bind可以使x參數函數x + k params std :: function?很明顯,它是如何從x + k params函數x params std :: function中產生的。 – Felics 2013-04-23 08:20:15

+0

@Felics是完全鈍的,嚴格的答案是:「這是實現定義的」 - 標準沒有指定如何實現'std :: function',或者就此而言,返回類型爲'std: :bind'。所以如果你真的想知道**它是如何實現的,請轉到你的實現。我以爲你在概念上問這個問題,我想我回答了這個問題。 – sehe 2013-04-23 08:48:46

+0

@Felics另請參閱[這個問題](http://stackoverflow.com/questions/13251976/why-do-objects-returned-from-bind-ignore-extra-arguments) – TemplateRex 2013-04-23 09:12:59

0

它是如何通過使用void(int)仿函數調用void()功能?

std::bind(fun)不返回void()函數,它返回未指定類型的調用包裝。

的常用方法來調用調用包裝將與零個參數,但在bind()大多數實現該類型可以零個或多個參數來調用和其他參數將被忽略(即不傳遞到目標功能)

更一般地,採取N參數的函數Fbind(F)返回調用包裝可以與N或多個參數來調用。如果綁定參數或使用佔位符,則會改變調用調用包裝器所需的最小參數數量。