2011-05-28 38 views
1

在成員函數部分的示例:Member functions 我們得到了一個結構X:結合成員函數

struct X { 
    int foo(int); 
}; 

優選的句法

boost::function<int (X*, int)> f; 

f = &X::foo; 

X x; 
f(&x, 5); 

便攜式語法

boost::function2<int, X*, int> f; 

f = &X::foo; 

X x; 
f(&x, 5); 

我的問題是:

  • 爲什麼我必須把額外的X *參數時,我INT FOO(INT)只有一個參數?另外,是一樣使用boost ::綁定,如:

人*人=新的Person( 「塗」,23);

boost :: function newFunc2 = boost :: bind(& Person :: printInfo,person);

  • 有什麼喜歡的語法和便攜式語法以及何時使用一個比另一個區別?
  • 什麼是函數對象?那是函數指針嗎?

回答

2
  1. 任何成員函數有一個指針指向該對象隱式設置作爲第一個參數進行操作。當你有這樣的代碼:X x; x.foo(10);編譯器可能真的爲你打電話foo(&x, 10)(看到here有兩種方式可以處理) - 顯然,foo這個名字會以某種方式被損壞。

  2. 有關語法的說明,請參閱Boost documentation。以下是頁面中最相關的摘錄。基本上,如果編譯器支持它,應該使用首選版本,因爲它最接近函數指針(可讀性)的正常定義,並且使用更少的模板參數(編譯時間更快)。

    Boost.Function有兩種語法形式:首選形式和便攜式形式。首選形式更符合C++語言,並減少了需要考慮的單獨模板參數的數量,通常可提高可讀性;但是,由於編譯器錯誤,首選表單在所有平臺上都不受支持。兼容的表單將在Boost.Function支持的所有編譯器上工作。請參閱下表以確定哪種語法形式用於您的編譯器。

  3. 一個函數指針是一個普通的舊指針恰好接受功能與特定的返回類型和參數列表。 A 函數對象是定義了operator()的任何類型 - 允許將其作爲函數調用。

+0

1.取決於編譯器,Visual C++在寄存器'ecx' iirc中傳遞'this'。 – Xeo 2011-05-28 12:07:32

+0

@Xeo,很好的電話,我不知道 - 我已經更新了答案,並且鏈接到維基百科中提到它。 – Node 2011-05-28 12:16:51

2
  1. 您必須通過X型的對象,因爲這是一個成員函數指針。你需要一個你調用該成員函數的對象。

  2. 可移植語法適用於較舊和較新的編譯器,並且優先語法不能在較早的編譯器上編譯。細節差異在functor tutorial page

  3. 中解釋函數對象是您可以作爲函數調用的對象。它可以是函數指針或成員函數指針

+1

我認爲你混合了首選和便攜式... – Xeo 2011-05-28 12:06:43

+0

@Xeo我不知道你的意思。此鏈接:http://www.boost.org/doc/libs/1_41_0/doc/html/function/tutorial.html解釋了這種差異,這就是我的理解 – 2011-05-28 16:19:29

+1

首選語法適用於那些支持它的編譯器,便攜式很好,可移植並且在更多編譯器(幾乎所有)上得到支持。這些詞的含義應該解釋它。首選是這樣命名的,因爲我們希望在任何地方都使用它,但不能,而且便攜式可用於大量編譯器。甚至可以鏈接到表格中! – Xeo 2011-05-28 16:25:27