2013-04-16 61 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了解更多详情。

相关问题