c – 如何从静态成员函数调用指向成员函数的指针?

我需要获得一个由标准函数指针调用的成员函数,所以我尝试抽象这样的东西:

class Sample {
public:
    virtual void doSomething(void) = 0;
};


class A : public Sample {
    void doSomething(void);     // details omitted
};

class B : public Sample {
    void doSomething(void);     // details omitted
};


class Executor {
public:
    Executor(Sample *sample)
     : func(&sample->doSomething)
    {
    }

    static void *execute(void *data) {
        Executor *pX = data;

        (pX->*func)();          // error invalid access of func from static function

        (pX->*pX->func)();      // error pointer to member type 'void (Sample::)()'
                                //       incompatible with object type 'Executor'
    }

private:
    void (Sample::*func)(void);
};



int main(void) {
    A   myA;
    B   myB;
    Executor x0(&myA);
    Executor x1(&myB);

    externallyInvoke(&Executor::execute, &x0);
    externallyInvoke(&Executor::execute, &x1);
}

externalInvoke是一个Linux系统调用,它接受一个函数指针和一个数据指针.
我想使用静态成员函数和this-pointer作为数据.

……我不希望像A或B这样的类有静态成员.所以我的想法是创建一个类Sample的接口,它由A和B扩展.

我的问题是我不知道如何从Executor :: execute函数内部调用指向成员函数的指针.

最佳答案 问题是你需要在execute内部有两个对象 – 一个是Executor的实例,它将提供func,另一个是(一个派生自的类)的实例,将调用func.所以你必须将对象存储在Executor中,而不是函数:

class Executor {
public:
    Executor(Sample *sample)
     : obj(sample)
    {
    }

    static void *execute(void *data) {
        Executor *pX = static_cast<Executor*>(data);

        pX->obj->doSomething();
    }

private:
    Sample *obj;
};


int main() { // note that `void main()` is not legal C++
    A   myA;
    B   myB;
    Executor x0(&myA);
    Executor x1(&myB);

    externallyInvoke(&Executor::execute, &x0);
    externallyInvoke(&Executor::execute, &x1);
}

指向成员函数的指针(例如您的原始void(Sample :: * func)())标识类中的函数,但不存储该对象.您仍然需要提供一个来调用该函数.

点赞