成员函数作为回调

时间:2013-04-16 19:54:08

标签: callback member

我想将实例化对象的成员函数传递给另一个函数。示例代码如下。我对任何有效的策略都是开放的,包括使用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;
}

2 个答案:

答案 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了解详情。