2013-04-16 89 views
1

我想將實例化對象的成員函數傳遞給另一個函數。示例代碼如下。我打開任何可行的策略,包括使用lambda或std :: bind之類的函數從memberfuncpointertestclass中的另一個函數調用functional()。請注意,我並不瞭解大多數關於lambda或std :: bind的google搜索結果,所以請儘可能保持簡單。另請注意,我的集羣沒有C++ 11,我想保持功能()儘可能簡單。謝謝!作爲回調的成員函數

int functional(int (*testmem)(int arg)) 
{ 
    int a = 4; 
    int b = testmem(a); 
    return b; 
} 

class memberfuncpointertestclass 
{ 
public: 
    int parm; 
    int member(int arg) 
    { 
     return(arg + parm); 
    } 
}; 

void funcpointertest() 
{ 
    memberfuncpointertestclass a; 
    a.parm = 3; 

    int (*testf)(int) = &a.member; 

    std::cout << functional(testf); 
} 

int main() 
{ 
    funcpointertest(); 
    return 0; 
} 
+0

爲什麼不傳遞對象並調用方法? – dlp

回答

0

對於沒有實例引用的對象,您無法調用方法。因此,您需要傳入實例以及要調用的方法。

嘗試改變functional到:

template <typename T, typename M> 
int functional(T *obj, M method) 
{ 
    int a = 4; 
    int b = (obj->*(method))(a); 
    return b; 
} 

和你funcpointertest到:

void funcpointertest() 
{ 
    memberfuncpointertestclass a; 
    a.parm = 3; 

    std::cout << functional(&a, &memberfuncpointertestclass::member); 
} 
0

這是std::function,多態函數包裝工作。傳遞給功能(...)這樣的功能對象:

#include <functional> 

typedef std::tr1::function<int(int)> CallbackFunction; 

int functional(CallbackFunction testmem) 
{ 
    int a = 4; 
    int b = testmem(a); 
    return b; 
} 

然後使用std::bind創建包裝memberfuncpointertestclass相同類型的)實例的一個功能對象::方法(:

void funcpointertest() 
{ 
    memberfuncpointertestclass a; 
    a.parm = 3; 

    CallbackFunction testf = std::bind(&memberfuncpointertestclass::member, &a, std::placeholders::_1); 

    std::cout << functional(testf); 
} 

查詢this item瞭解更多詳情。

相關問題