2014-02-28 137 views
1

所以我有C++這需要在其他功能的功能:我可以傳遞一個類的成員函數作爲函數參數嗎?

double integral(double (*f)(double x){...}; 

我也有有一個成員函數f類:

class Test{ 
public: 
    double myfun(double x){...}; 
}; 

我希望能夠調用的積分函數使用類Test的成員函數myfun。有沒有辦法做到這一點?例如,是否有可能做到以下幾點:

Test A; 
integral(A.myfun); 

我甚至會想這進一步採取並調用類的測試中不可或缺的,利用自身的成員函數作爲輸入!

謝謝!

+0

我從來沒有需要,也不確定你可以。我爲靜態函數執行此操作,但對於常規成員函數,我安排使用多態或函數對象的東西。 – Bathsheba

+0

你的「積分」功能是你自己的嗎?你能修改它,接受其他類型嗎? – hvd

+0

在這個例子中,是的。但對於真正的問題,這個功能並不是我可以輕易改變的。 – kchow462

回答

2

否;普通函數指針不能將地址存儲到非靜態成員函數中。以下是您可能考慮的兩種解決方案。

1)使myfun靜態。然後integral(A::myfun)應該編譯。

2)如果有C++ 11支持,使integral功能採取一般的函子類型,

template<typename Functor> 
double integral(Functor f) { ... }; 

和結合的Test一個實例來創建函數對象只需要double作爲說法,

Test A; 
integral(std::bind(&Test::myfun, A, std::placeholders::_1)); 

或簡單地傳遞一個拉姆達,

Test A; 
integral([&A](double x){ return A.myfun(x); }); 
+1

如果您沒有C++ 11支持,您可以使用boost庫並獲取boost :: bind。 – dutt

相關問題