функция-член как обратный вызов

Я хотел бы передать функцию-член созданного объекта другой функции. Пример кода ниже. Я открыт для любой стратегии, которая работает, включая вызов function() из другой функции внутри класса memberfuncpointertest, используя что-то вроде lambda или std::bind. Обратите внимание, что я не понял большинство тем, которые я нашел в Google о lambda или std::bind, поэтому, пожалуйста, если возможно, будьте проще. Также обратите внимание, что в моем кластере нет C++ 11, и я хотел бы, чтобы функция function() была такой же простой, как она есть. Спасибо!

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;
}

person megavore    schedule 16.04.2013    source источник
comment
Почему бы просто не передать объект и не вызвать метод?   -  person dlp    schedule 17.04.2013


Ответы (2)


Вы не можете вызвать метод для объекта без экземпляра, на который можно ссылаться. Итак, вам нужно передать как экземпляр, так и метод, который вы хотите вызвать.

Попробуйте изменить 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);
}
person jxh    schedule 16.04.2013

Это работа для std::function, оболочки полиморфной функции. Передайте в 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::method() экземпляра a:

void funcpointertest()
{
    memberfuncpointertestclass a;
    a.parm = 3;

    CallbackFunction testf = std::bind(&memberfuncpointertestclass::member, &a, std::placeholders::_1);

    std::cout << functional(testf);
}

Проверьте этот элемент для получения более подробной информации.

person Yann    schedule 02.07.2014