2013-03-21 65 views
5

解釋如何使用std::bind的一個簡單示例如下:如何使用std :: bind?

假設我們有3個參數的函數:f3(x,y,z)。我們希望有一個定義爲2個參數的函數:f2(x,y) = f3(x,5,y)。在C++中,我們可以很容易地std::bind做到這一點:

auto f2 = std::bind(f3, _1, 5, _2); 

這個例子我很清楚:std::bind帶一個函數作爲第一個參數,然後它需要N個其他參數,其中n是函數的參數個數這被認爲是std::bind的第一個參數。

然而,我發現了另一個使用綁定的:

​​

顯然,foo有一個參數,並與std::bind它被設置爲i。但是爲什麼我們在(foo, i)之後使用另一對括號?爲什麼我們不使用std::bind的輸出?我的意思是,爲什麼我們沒有auto f = std::bind(foo, i)

+2

究竟是'\\\'? – 2013-03-21 08:54:14

+0

它應該是一個評論:// – Roman 2013-03-21 08:56:17

回答

8

std::bind(foo, i)(); 

相當於:

auto bar = std::bind(foo, i); 
bar(); 

它創建了一個結合的算符,然後立即將其稱爲(使用第二對括號的)。

編輯:在準確性的名稱(並由@Roman,@daramarak指出)這兩個不是實際上等同於直接調用該函數:我通過值傳遞給std :: bind。相當於直接與我通話foo代碼,將是:

auto bar = std::bind(foo, std::ref(i)); 
bar(); 
+0

刪除了我對無效異議的評論 – daramarak 2013-09-10 11:13:41

2

你的兩個問題幾乎回答對方。尾部()只是一個正常的函數調用。因此,該表達意味着:「綁定ifoo;這將產生一個不帶參數的函數;然後調用結果函數。」由於代碼的作者決定調用後不再需要該函數,它不會存儲在任何地方。

3

它結合foo到一個臨時對象,然後立即調用該函數:

auto f = std::bind(foo, i); 
    f(); 

單行版本:

std::bind(foo, i)(); 
0

由於線

std::bind(foo, i)() ; 

...做的同樣的事情...

foo(i); 

...這是不是真的一個std ::綁定「使用」,你可能會在實際的代碼遇到,但它確實起到什麼標準::綁定的一個簡單的例子確實,在其他解釋答案。

正如你指出的那樣,通常情況下,存儲綁定的結果並將其調用到別的地方,否則沒有必要先用std :: bind將代碼複雜化。