我有一个框架函数,它需要一个对象和一个成员函数指针(回调),如下所示:
do_some_work(Object* optr, void (Object::*fptr)()); // will call (optr->*fptr)()
如何将 lambda 表达式传递给它?想做这样的事情:
class MyObject : public Object
{
void mystuff()
{
do_some_work(this, [](){ /* this lambda I want to pass */ });
}
};
这一切的意义是不要让回调使 MyObject 类的接口变得混乱。
UPD
我无法改进do_some_work
,因为我不控制框架,而且实际上它不是一个功能,有数百个。整个框架基于该类型的回调。没有 lambda 的常见用法示例:
typedef void (Object::*Callback)();
class MyObject : public Object
{
void mystuff()
{
do_some_work(this, (Callback)(MyClass::do_work));
}
void do_work()
{
// here the work is done
}
};
解决方案这是我基于马塞洛回答的解决方案:
class CallbackWrapper : public Object
{
fptr fptr_;
public:
CallbackWrapper(void (*fptr)()) : fptr_(fptr) { }
void execute()
{
*fptr_();
}
};
class MyObject : public Object
{
void mystuff()
{
CallbackWrapper* do_work = new CallbackWrapper([]()
{
/* this lambda is passed */
});
do_some_work(do_work, (Callback)(CallbackWrapper::execute));
}
};
由于我们创建了 CallbackWrapper,我们可以在异步使用回调的情况下控制它的生命周期。谢谢大家。