У меня есть функция фреймворка, которая ожидает объект и указатель функции-члена (обратный вызов ), вот так:
do_some_work(Object* optr, void (Object::*fptr)()); // will call (optr->*fptr)()
Как я могу передать ему лямбда-выражение? Хотите сделать что-то вроде этого:
class MyObject : public Object
{
void mystuff()
{
do_some_work(this, [](){ /* this lambda I want to pass */ });
}
};
Смысл всего этого в том, чтобы не загромождать интерфейс класса MyObject обратными вызовами.
УПД Я никак не могу улучшить do_some_work
, потому что я не контролирую фреймворк и потому что на самом деле это не одна функция, их сотни. Вся структура основана на обратных вызовах этого типа. Распространенный пример использования без лямбда-выражений:
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, мы можем контролировать его время жизни для случаев, когда обратный вызов используется асинхронно. Спасибо всем.