2009-02-09 142 views
80

我不喜歡讓魔術盒散佈在我的代碼中......這兩個類究竟如何工作,基本上允許任何函數映射到函數對象,即使函數<>具有完全不同的參數設置爲所述一個即時傳遞到boost::bindboost :: function和boost :: bind如何工作

它甚至用不同的調用約定有效(即構件的方法是__thiscall VC下,但「正常」的功能是通常對於那些需要__cdecl__stdcall與C兼容。

+0

Dupe:http://stackoverflow.com/questions/112738/how-does-boost-bind-work-behind-the-scenes-in-general – 2009-02-09 08:59:59

+1

不是真的 - 這個問題是關於綁定和功能 – 2009-02-09 09:15:39

回答

94

boost::function允許任何與operator()將正確的簽名綁定爲參數,並且可以使用參數int調用綁定的結果,因此它可以綁定到function<void(int)>

這是如何工作的(這描述適用一樣爲std::function):

boost::bind(&klass::member, instance, 0, _1)返回這樣

struct unspecified_type 
{ 
    ... some members ... 
    return_type operator()(int i) const { return instance->*&klass::member(0, i); 
} 

其中return_typeint從的klass::member簽名推斷的對象,並且函數指針和綁定參數實際上存儲在對象中,但這不重要

現在,boost::function確實不做任何類型檢查:它將採用您在其模板參數中提供的任何對象和任何簽名,並根據您的簽名創建可調用的對象並調用該對象。如果這是不可能的,這是一個編譯錯誤。

boost::function實際上是這樣的對象:

template <class Sig> 
class function 
{ 
    function_impl<Sig>* f; 
public: 
    return_type operator()(argument_type arg0) const { return (*f)(arg0); } 
}; 

其中return_typeargument_typeSig萃取,f在堆上動態分配的。這需要允許完全不相關的不同尺寸的物體綁定到boost::function

function_impl僅僅是一個抽象類

template <class Sig> 
class function_impl 
{ 
public: 
    virtual return_type operator()(argument_type arg0) const=0; 
}; 

,做所有的工作類,是從boost::function派生的具體類。有一個爲每個分配到boost::function

template <class Sig, class Object> 
class function_impl_concrete : public function_impl<Sig> 
{ 
    Object o 
public: 
    virtual return_type operator()(argument_type arg0) const=0 { return o(arg0); } 
}; 

這意味着你的情況類型的對象,分配給Boost功能:

  1. 實例(當然這是編譯的時候,)一類function_impl_concrete<void(int), unspecified_type>
  2. 創建該類型在堆上
  3. 的新對象分配此目的是升壓的f-構件::函數

當您調用函數對象時,它會調用其實現對象的虛函數,該函數會將調用引導至您的原始函數。

免責聲明:請注意,此解釋中的名稱是故意組成的。與真人或角色的任何相似......你知道它。目的是說明原則。

相關問題