1

我想将实例化对象的成员函数传递给另一个函数。示例代码如下。我对任何可行的策略持开放态度,包括使用 lambda 或 std::bind 从 memberfuncpointertestclass 中的另一个函数调用函数()。请注意,我不理解我在 google 上找到的关于 lambda 或 std::bind 的大部分线程,所以请尽可能保持简单。另请注意,我的集群没有 C++ 11,我想保持功能()尽可能简单。谢谢!

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

2 回答 2

0

这是std::function一个多态函数包装器的工作。将这样的函数对象传递给functional(...):

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

检查此项目以获取更多详细信息。

于 2014-07-02T20:23:30.943 回答
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);
}
于 2013-04-16T20:03:24.667 回答