Это объявление пытается определить обычную функцию по имени p, которая возвращает указатель на член класса Screen типа char. Поскольку объявляется обычная функция, за объявлением не может быть спецификатора const.
В отличие от обычных указателей на функцию, нет никакого автоматического преобразования между функцией-членом и указателем на этот член:
//
//
pmf = &Screen::get; //
//
pmf = Screen::get; //
//
Как и при использовании указателя на переменную-член, для вызова функции-члена через указатель на член класса используются операторы .* и ->*:
Screen myScreen, *pScreen = &myScreen
//
//
char c1 = (pScreen->*pmf)();
//
//
char c2 = (myScreen.*pmf2)(0, 0);
Вызовы (myScreen->*pmf)() и (pScreen.*pmf2)(0,0) требуют круглых скобок, поскольку приоритет оператора вызова выше, чем приоритет оператора указателя на член класса.
Без круглых скобок вызов myScreen.*pmf() был бы интерпретирован как myScreen.*(pmf()).
Этот код требует вызвать функцию pmf() и использовать ее возвращаемое значение как операнд оператора указателя на член класса (.*). Но pmf — не функция, поэтому данный код ошибочен.
(С::*p)(parms) и (obj.*p) (args).
Псевдонимы типа или typedef (см. раздел 2.5.1) существенно облегчают чтение указателей на члены. Например, следующий код определяет псевдоним типа Action как альтернативное имя для типа версии функции get() с двумя параметрами:
//
//
using Action =
char (Screen::*)(Screen::pos, Screen::pos) const;
Action — это другое имя для типа "указатель на константную функцию-член класса Screen, получающую два параметра типа pos и возвращающую тип char". Используя этот псевдоним, можно упростить определение указателя на функцию get() следующим образом:
Action get = &Screen::get; //
Подобно любым другим указателям на функцию, тип указателя на функцию-член можно использовать как тип возвращаемого значения или как тип параметра функции. Подобно любому другому параметру, у параметра указателя на член класса может быть аргумент по умолчанию:
//
//
Screen& action(Screen&, Action = &Screen::get);
Функция action() получает два параметра, которые являются ссылками на объект класса Screen, и указатель на функцию-член класса Screen, получающую два параметра типа pos и возвращающую тип char. Функцию action() можно вызвать, передав ей указатель или адрес соответствующей функции-члена класса Screen:
Screen myScreen;
//
action(myScreen); //
action(myScreen, get); //
//
action(myScreen, &Screen::get); //