передавать лямбда-выражение как указатель функции-члена в c++

У меня есть функция фреймворка, которая ожидает объект и указатель функции-члена (обратный вызов ), вот так:

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, мы можем контролировать его время жизни для случаев, когда обратный вызов используется асинхронно. Спасибо всем.

5
задан ivzave 10 August 2012 в 13:51
поделиться