2010-09-20 108 views
7

我想了解下面的示例中,類似(但不等於)給一個在SO Help understanding boost::bind placeholder arguments早些時候發佈:Boost.Bind - 瞭解佔位符

#include <boost/bind.hpp> 
#include <functional> 

struct X { 
    int value; 
}; 

int main() {  
    X a = { 1 }; 
    X b = { 2 }; 

    boost::bind(std::less<int>(), 
     boost::bind(&X::value, _1), 
     boost::bind(&X::value, _2)) 
    (a, b); 
} 

這怎麼可能,那最外層結合功能知道它有第一個參數傳遞給第二綁定(即期望_1),第二個參數到第三綁定(即期望_2)?我看到的方式是先評估內部活頁夾,然後將它們變成兩個一元功能對象,稍後傳遞給對象的活頁夾。且當新創建的功能對象與兩個對象被調用,a去所述第一內結合,並b轉到第二。如果我是對的,我們會使用兩次_1。我一定是錯的。我會再次重複我的問題,以清楚地說明問題:外部聯編程序如何知道哪個佔位符用於哪個內部聯編程序?

回答

7

參數被包裝在元組(A,B),並傳遞給仿函數。那麼內部仿函數決定它需要哪個元組元素,例如嘗試:

boost::bind(&X::value, _1)(a,b) 
boost::bind(&X::value, _2)(a,b) 

更一般地,每一個值,如果無論它是恆定的/參照/佔位符被表示爲仿這需要參數元組,並返回值。

bind(f, 10)(a) // still functor which discards arguments 

現在,我不是百分百確定這是如何綁定它。不過,這是鳳凰城如何實現其功能。如果你想了解綁定/ lambda實現的機制,看看鳳凰,它是非常可擴展的,並具有優秀的文檔。

+0

好吧,我得到它。但是如果其中一個綁定參數不是活頁夾,例如costant值?我的意思是:boost :: bind(std :: less (),boost :: bind(&X :: value,_1),10)(a);它如何知道應該爲哪個參數分配生成的元組? – 2010-09-20 22:05:23

+1

@Mar我已經更新了我的答案,請隨時查看 – Anycorn 2010-09-21 00:35:19