【问题标题】:member function as callback成员函数作为回调
【发布时间】:2013-04-09 09:07:37
【问题描述】:

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

【问题讨论】:

  • 为什么不直接传递对象并调用方法?

标签: callback member


【解决方案1】:

你不能在没有实例引用的对象上调用方法。因此,您需要传入实例以及要调用的方法。

尝试将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);
}

【讨论】:

    【解决方案2】:

    这是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);
    }
    

    查看this item了解更多详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多