Для вопросов относительно синтаксиса указателя на неудобные функции я лично использую шпаргалку: Учебное пособие по указателям на функции ( можно загрузить здесь , благодаря Vector для указывая на это).
Однако, как вы уже видели, подпись функции-члена немного отличается от подписи обычной функции.
Как вы, вероятно, знаете, функция-член имеет скрытый параметр this
, тип которого необходимо указать.
// C++11 and above.
using Member = int (Foo::*)(int, int);
// C++03 and below.
typedef int (Foo::*Member)(int, int);
позволяет вам указать, что первый элемент, переданный функции, будет Foo*
(и, таким образом, ваш метод действительно принимает 3 аргумента, когда вы об этом думаете, а не только 2.
Однако есть и другая причина, заставляющая вас указать тип.
Указатель на функцию может ссылаться на виртуальную функцию, и в этом случае все может быть довольно сложно. Следовательно, размер представления в памяти изменяется в зависимости от типа функции. Действительно, в Visual Studio размер указателя на функцию может варьироваться от 1 до 4 раз больше размера обычного указателя. Это зависит от того, является ли функция виртуальной, в частности.
Следовательно, класс, к которому относится функция , является частью сигнатуры , и обходного пути нет.