2010-07-20 125 views
4

我想爲像lower_bound(...,Compare comp)這樣的STL算法的「comp」參數提供成員函數。 comp()函數訪問非靜態成員字段,因此它本身必須是非靜態成員,但非靜態成員函數指針的類型與普通函數指針的類型不同。在C++中將「成員函數指針」轉換爲函數指針的最簡單方法是什麼?

解決此問題的最佳方法是什麼?

+1

你想谷歌的詞是「仿」 – 2010-07-20 07:32:00

+0

或函數對象,或者用C++ 11,一個lambda /匿名函數:) – legends2k 2012-12-30 15:25:46

回答

7

這是最常見的使用std::mem_funstd::mem_fun_ref。它們是創建調用指定成員函數的函子的模板。 TR1增加了一個std::tr1::bind,這也是有用的和更通用的(如果你沒有TR1可用,那是基於Boost::bind)。 C++ 0x將在標準庫中包含std::bind(與TR1幾乎沒有變化)。

+0

mem_fun()僅適用於具有一個或沒有參數的函數,而comp必須指向具有兩個參數的函數。 Qt中有這個功能嗎? – zoo 2010-07-20 06:30:30

+0

'mem_fun'也不能用於有參考參數的函數:(如果你使用'mem_fun_ref',然後嘗試將它與'bind1st'或'bind2nd'結合起來,它會再次失敗,因爲它們已經被破壞了。完全變爲'boost :: bind'和'boost :: function' – 2010-07-20 09:59:55

+0

對於那些遲到這個頁面的人來說,像我一樣:避免使用已經廢棄的mem_fun和mem_fun_ref;切換到mem_fn。詳細信息:* http://stackoverflow.com/questions/11680807/stdmem-fun-vs-stdmem-fn – legends2k 2012-12-30 15:24:27

6

這聽起來像你想要類似boost::bind的東西,將成員函數指針綁定到該類的一個實例。

您是否願意詳細說明您的問題,以瞭解您要做什麼?示例代碼等?

+0

升壓綁定絕對是最靈活的解決方案。 – StackedCrooked 2010-07-20 09:13:05

1
#include<tr1/functional> 

和使用的mem_fn()