Для вопросов, касающихся неудобного синтаксиса указателя функции, я лично использую шпаргалку: Учебное пособие по указателям функций (загружается здесь, спасибо 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 раза превышать размер обычного указателя. В частности, это зависит от того, является ли функция виртуальной.
Таким образом, класс, на который ссылается функция, является частью подписи, и нет обходного пути.
person
Matthieu M.
schedule
29.01.2011
typedef
не то, что вам нужно? - person GManNickG   schedule 28.01.2011