Кажется, вы не понимаете, как работают указатели на функции-члены.Для данного класса существует только один экземпляр любой данной функции.Они отличаются использованием неявного параметра this
.По сути, вы можете притвориться, что у вас есть следующее отображение:
struct Struct { void Function(); }
Struct a;
a.Function();
превращается в
struct Struct { }
void Function(Struct* this);
Struct a;
Function(&a);
Так что если у вас есть набор Struct
объектов, и вы хотите вызвать Function
на небольшом наборе из них вы не сохраняете Function
, вы храните Struct
.
Указатели на функции-члены используются, когда у вас есть несколько функций, которые вы хотитезвонить выборочно.Так что если в вашем классе есть две функции, каждая из которых не принимает параметров и возвращает void, void (Struct::*)()
может указывать на любую из них.Но это все же указывает на конкретную функцию, из которой есть только одна.Вам по-прежнему необходимо предоставить параметр this
.
struct Struct {
Struct(int v) : value(v) { }
void One() { cout << "one: " << value << endl; }
void Two() { cout << "two: " << value << endl; }
int value;
};
int main()
{
std::vector<Struct> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::vector<void (Struct::*)()> f;
f.push_back(&Struct::One);
f.push_back(&Struct::Two);
f.push_back(&Struct::One);
for(int i = 0; i < 3; ++i)
(v[i].*f[i])();
}
Не лучший пример, но он помогает понять смысл.Вы можете смешивать и сопоставлять объекты с помощью функций-членов.
* edit: Пример без использования контейнеров
Struct a(5), b(10);
void (Struct::*one)() = &Struct::One;
void (Struct::*two)() = &Struct::Two;
(a.*one)();
(b.*one)();
(a.*two)();
(b.*two)();
Обратите внимание на дополнительные скобки.a.*one()
недостаточно.