我不喜歡讓魔術盒散佈在我的代碼中......這兩個類究竟如何工作,基本上允許任何函數映射到函數對象,即使函數<>具有完全不同的參數設置爲所述一個即時傳遞到boost::bind
boost :: function和boost :: bind如何工作
它甚至用不同的調用約定有效(即構件的方法是__thiscall
VC下,但「正常」的功能是通常對於那些需要__cdecl
或__stdcall
與C兼容。
我不喜歡讓魔術盒散佈在我的代碼中......這兩個類究竟如何工作,基本上允許任何函數映射到函數對象,即使函數<>具有完全不同的參數設置爲所述一個即時傳遞到boost::bind
boost :: function和boost :: bind如何工作
它甚至用不同的調用約定有效(即構件的方法是__thiscall
VC下,但「正常」的功能是通常對於那些需要__cdecl
或__stdcall
與C兼容。
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_type
和int
從的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_type
和argument_type
從Sig
萃取,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功能:
function_impl_concrete<void(int), unspecified_type>
當您調用函數對象時,它會調用其實現對象的虛函數,該函數會將調用引導至您的原始函數。
免責聲明:請注意,此解釋中的名稱是故意組成的。與真人或角色的任何相似......你知道它。目的是說明原則。
Dupe:http://stackoverflow.com/questions/112738/how-does-boost-bind-work-behind-the-scenes-in-general – 2009-02-09 08:59:59
不是真的 - 這個問題是關於綁定和功能 – 2009-02-09 09:15:39