2014-11-01 87 views
0

說我有一個功能foo如何將成員函數作爲參數傳遞給不期望的函數?

void foo(void (*ftn)(int x)) 
{ 
    ftn(5); 
} 

它需要作爲參數void函數接受一個int作爲參數。考慮

void func1(int x) {} 

class X { 
public: 
    void func2(int x) {} 
}; 

現在 foo(&func1)是確定的。

foo(&X::func2)也不行,因爲X::func2也不是一成不變的,需要上下文對象及其函數指針是不同的。

我試過foo(std::bind(&X:func2, this))X裏面,但這也引起類型不匹配。

這樣做的正確方法是什麼?

+0

考慮改變你的函數,把'std :: function'作爲它的參數。這樣你可以使用'std :: bind'來透明地使用一個自由函數,靜態成員函數或者非靜態成員函數。 – 2014-11-01 18:32:13

+0

模板函數foo最有可能是最簡單的解決方案。編輯:是的,如上所述,更簡單的可能是std :: function – Creris 2014-11-01 18:32:15

+0

如果我不允許更改'foo'(庫的一部分)怎麼辦? – batman 2014-11-01 18:39:52

回答

2

根據該意見,如果你不能改變的foo簽名拿任何東西,但一個原始函數指針...那麼你就必須做這樣的事情:

struct XFunc2Wrapper { 
    static X* x; 

    static void func2(int v) { 
     x->func2(v); 
    } 
}; 

然後就去做foo(&XFunc2Wrapper::func2)一旦您設置XFunc2Wrapper::x爲您的X。它不必嵌套在結構中,它可以是一些全局指針,但嵌套有助於更好地建立代碼背後的意圖。

但是,這應該是絕對是最後的手段(根據隊長Obvlious)試圖做foo(std::function<void(int)>)

相關問題