Мне нужно получить функцию-член, вызываемую указателем стандартной функции, поэтому я попытался абстрагироваться от таких вещей:
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);
}
externallyInvoke
- это системный вызов Linux, который принимает указатель функции и указатель данных. Я хотел бы использовать статическую функцию-член вместе с указателем this в качестве данных.
... и я не хочу, чтобы классы типа A
или B
имели статические члены. Итак, моя идея состояла в том, чтобы создать интерфейс, подобный классу Sample
, который расширяется на A
и B
.
Моя проблема в том, что я не знаю, как вызвать указатель на функцию-член изнутри функции Executor::execute
.