Когда я только начинал использовать С++, то всё время забывал синтаксис определения указателей на функции и особенно указателей на функции члены.
Позже узнал об одном небольшом lifehack'e, который помог мне избавиться от того что-бы держать в голове синтаксис определения указателей на функции. Правда чуть позже этот всё само как-то осело у меня в голове и даже стало очевидно.
На днях показывал этот lifehack одному программисту и решил поделиться им здесь.
Что бы избежать долгих объяснений, приведу пример. Имеется класс test с виртуальным методом foo и деструктором ~test:
class test
{
virtual int foo( const test& ) const
{
return 0;
};
virtual ~test()
{}
};
Допустим далее по коду нам нужно объявить указатель на метод test::foo. Для того что-бы выяснить, как он должен объявляться, напишем (в самом примитивном виде) адрес данного метода, и попытаемся приравнять его заведомо неправильному типу:
char c = &test::foo;
и попробуем собрать (для примера буду использовать компилятор от Microsoft, хотя проверял подобное на gcc и Comeau Online Compiller).
Получаем следующую ошибку:
error C2440: 'initializing' : cannot convert from 'int (__thiscall test::* )(const test &) const' to 'char'
Вот из этой ошибки мы и возьмем синтаксис объявления указателя на данный член (явное указание типа вызова __thiscall — выкинем):
int ( test::* )(const test &) const
Теперь добавим имя создаваемой переменной func, которая будет являться указателем на функцию, и сделаем ее инициализацию:
int ( test::* func )(const test &) const = &test::foo;
Готово!