Короче говоря: да, это возможно, и нет, это не делает то, что вы думаете.
Важным фактом является то, что нестатические функции-члены не являются функциями (точно так же, как пихта Дугласа не пихта). Это член функции, и это нечто другое. Они могут быть вызваны только для данного экземпляра объекта.
Таким образом, чтобы вызвать функцию-член X::foo()
данного экземпляра X a;
, т. Е. Выполнить вызов a.foo()
, вам нужна как информация, которую вы хотите использовать X::foo()
, так и та, которую вы хотите вызвать его в экземпляре a
. Первый из них предоставляется указателем на функцию-член , который не является указателем , а второй - указателем экземпляра или ссылкой:
struct X { int foo(bool, char); }; // class definition
X a; // an instance
X * p = &a; // just for demonstration
int (X::*)(bool, char) ptmf = &X::foo; // pointer-to-member-function
Теперь для вызова:
(a.*ptmf)(false, 'a');
(p->*ptmp)(true, 'z');
В двух словах: foo
само по себе не позволяет вам звонить. Вызываемая сущность - это пара (&X::foo, a)
, которая позволяет вам звонить a.foo()
.