我想将实例化对象的成员函数传递给另一个函数。示例代码如下。我对任何有效的策略都是开放的,包括使用lambda或std :: bind之类的函数从memberfuncpointertestclass中的另一个函数调用functional()。请注意,我不了解我在google上发现的关于lambda或std :: bind的大多数主题,所以如果可能的话,请保持简单。还要注意我的集群没有C ++ 11,我想保持functional()尽可能简单。谢谢!
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 :(得分: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);
}
答案 1 :(得分: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
创建一个包含实例a的memberfuncpointertestclass :: method()的相同类型的函数对象:
void funcpointertest()
{
memberfuncpointertestclass a;
a.parm = 3;
CallbackFunction testf = std::bind(&memberfuncpointertestclass::member, &a, std::placeholders::_1);
std::cout << functional(testf);
}
查看this item了解详情。