Передача функций-членов в качестве аргументов проста.Хитрость в синтаксисе.Вам не нужны статические функции, вам нужен указатель на функцию-член и указатель на вызывающий объект.
См. Этот пример
#include <iostream>
using namespace std;
class Foo {
public:
virtual void MemberFunc() {
std::cout << "MemberFunc called" << std::endl;
}
virtual void MemberFuncWithArgs(int a, std::string b, double c) {
std::cout << "MemberFuncWithArgs called with a = " << a << " b = " << b << " c = " << c << std::endl;
}
};
class Bar : public Foo {
public:
virtual void MemberFunc() {
std::cout << "Bar MemberFunc called" << std::endl;
}
};
// funPtr is a pointer to the function in the class Foo:: scope that takes zero arguments and returns void
void CallClassFunction(void (Foo::*funPtr)(), Foo* obj) {
// We deference the function pointer and invoke it on the caller
(obj->*funPtr)();
}
// Same as above but funPtr takes 3 arguments
void CallClassFunctionWithArgs(void (Foo::*funPtr)(int a, std::string b, double c), int a, std::string b, double c, Foo* obj) {
(obj->*funPtr)(a, b, c);
}
int main()
{
cout<<"Hello World";
Foo obj;
// We take the address of the class member function (makes a pointer)
// We take a pointer to the obj variable
CallClassFunction(&Foo::MemberFunc, &obj);
CallClassFunctionWithArgs(&Foo::MemberFuncWithArgs, 34, "hello", 65.87, &obj);
// Works with inheritance too! This will now call Bar::MemberFunc
Bar bar;
CallClassFunction(&Foo::MemberFunc, &bar);
return 0;
}