Синтаксис указателя на функцию-член равен ReturnType (Class::*)(ParameterTypes...)
, например ::
typedef B* (A::*MemFuncPtr)(); // readability
MemFuncPtr mfs[] = { &A::foo, &A::bar }; // declaring and initializing the array
B* bptr1 = (pointerToA->*mfs[0])(); // call A::foo() through pointer to A
B* bptr2 = (instanceOfA.*mfs[0])(); // call A::foo() through instance of A
См. Например эта статья InformIT для более подробной информации об указателях для членов.
Возможно, вы также захотите изучить Boost.Bind и Boost.Function (или их эквиваленты TR1), которые позволяют непрозрачно связывать указатели на функции-члены с экземпляром. :
typedef boost::function<B* ()> BoundMemFunc;
A instanceOfA;
BoundMemFunc mfs[] = {
boost::bind(&A::foo, &instanceOfA),
boost::bind(&A::bar, &instanceOfA)
};
B* bptr = mfs[0](); // call A::foo() on instanceOfA
Чтобы использовать такой массив в качестве члена, обратите внимание, что вы не можете инициализировать массивы, используя список инициализаторов членов. Таким образом, вы можете присвоить ему в теле конструктора:
A::A {
mfs[0] = &A::foo;
}
... или вы используете тип, который на самом деле может быть инициализирован там, например std::vector
или boost::array
:
struct A {
const std::vector<MemFuncPtr> mfs;
// ...
};
namespace {
std::vector<MemFuncPtr> init_mfs() {
std::vector<MemFuncPtr> mfs;
mfs.push_back(&A::foo);
mfs.push_back(&A::bar);
return mfs;
}
}
A::A() : mfs(init_mfs()) {}