2012-12-17 74 views
3

我寫了下面的代碼,沒有多想我在做什麼,我真的很驚訝它實際上按我的意圖工作。綁定中的深度參數

有人可以解釋爲什麼和如何綁定管理與深參數?

#include <string> 
#include <cstdio> 
#include <vector> 
#include <algorithm> 
#include <functional> 
using namespace std; 
using namespace placeholders; 

int main() 
{ 
    vector<string> s = { "abc", "aaaaaaa", "c" }; 

    for_each(s.begin(),s.end(), 
      bind(printf,"string length is %d\n",bind(&string::length,_1))); 
} 
+1

顯然'for_each'深度迭代向量。 –

+2

什麼是*深參數*? – Nawaz

+0

@Nawaz參數不是外部綁定的參數,而是一個內部綁定。如示例中所示。 –

回答

3

該標準定義了一元型特徵is_bind_expression<T>如果Tstd::bind()返回調用包裝類型,是真實的,或者特質是否專門用於用戶定義的類型。

當調用調用包裝函數時,如果它的任何綁定參數是一個綁定表達式(由is_bind_expression確定),那麼在調用外部表達式時使用所有相同的參數調用該嵌套綁定表達式。嵌套的綁定表達式可以選擇任何具有佔位符的參數(在您的示例中爲_1)。這是遞歸地完成的,因此調用內部綁定表達式還將檢查它的任何綁定參數是否是綁定表達式,並使用相同的參數集來調用它們等等。

2

我不知道究竟bind怎麼做到這一點,但我不認爲這是一個謎,如果你得到的區別。

bind的類型可能因輸入類型而異。因此,具有_1作爲輸入類型的bind可以注意到它在返回類型中消耗_1(事實上,這很有意義)。 bind也可以從其參數中提取此事實(參數中存在未綁定的_1)。

引述某些std::bind文檔:

如果標準:: is_bind_expression ::值== TRUE(即,另一sbind 子表達式被用作一個參數在初始呼叫結合),然後 了結合-subexpressin立即被調用,其結果是 傳遞給可調用對象。如果綁定子表達式有任何 佔位參數,它們是從U1,U2採摘,....

+0

標準確實說明它是如何實現的,請參見[func.bind.isbind]/1和[func.bind.bind]/10。它使用'is_bind_expression'來檢測綁定參數是否是綁定表達式,如果是,則遞歸調用它。將'_1'作爲輸入類型無關,它也適用於沒有佔位符的嵌套綁定表達式。 –

+0

@JonathanWakely謝謝!刪除了我認爲我知道我不該知道的信息,但事實證明我應該知道。 – Yakk

+0

heh :)如果你想專門化'is_bind_expression'來使你自己的類型可以使用'bind',你只需要知道它,所以它是被指定的,但通常不需要知道 –