C ++绑定非静态成员函数

时间:2016-10-13 06:37:47

标签: c++ c++11

我正在尝试将成员函数传递给嵌套类中的另一个函数。

传递非成员函数效果很好但传递成员不会编译:

A.H:
class A
{
    class B
    {
        B();
        ~B();
        doSomething();
    };

    class C
    {
        C();
        ~C();
        execute(function<void(void)> func);
    };

    C *myC;
    map<int, B> myMap;
}
A.cpp:
void A::member(int param)
{
    A::myMap[param].doSomething();
}

void nonA_func(int param)
{
    ...
}

void A::caller()
{
    myC->execute(bind(nonA_func, 42)); // OK
    myC->execute(bind(A::member, 42)); // COMPILER ERROR 1

    myC->execute(A::myMap[42].doSomething()); // COMPILER ERROR 2
}

A::main()
{
    myC = new A::C();
    // filling myMap

    caller();

    myMap.clear();
    delete C;
}

编译以下COMPILER ERROR 1时:

error: invalid use of non-static member function  
    myC->execute(bind(A::member, 42));
                               ^

实际上将A::member定义为static可以解决此问题,但之后我再也无法访问myMap了。 如何绑定非静态成员函数?

我还尝试直接传递被调用的函数,从而产生COMPILER ERROR 2

 invalid use of void expression  
     myC->execute(A::myMap[42].doSomething());
                                       ^

1 个答案:

答案 0 :(得分:4)

您需要将this指针传递给bind(或lambda)。如果没有实例,则无法使用实例变量/函数。

myC->execute(bind(&A::member, this, 42));
myC->execute([this]{ member(42); });