Тип указателя на функцию
Как объявить указатель на функцию? Как выглядит формальный параметр, когда фактическим аргументом является такой указатель? Вот определение функции lexicoCompare(), которая сравнивает две строки лексикографически:
#include <string>
int lexicoCompare( const string &sl, const string &s2 ) {
return sl.compare(s2);
}
Если все символы строк s1 и s2 равны, lexicoCompare() вернет 0, в противном случае– отрицательное число, если s1 меньше чем s2, и положительное, если s1 больше s2.
Имя функции не входит в ее сигнатуру – она определяется только типом возвращаемого значения и списком параметров. Указатель на lexicoCompare() должен адресовать функцию с той же сигнатурой. Попробуем написать так:
int *pf( const string &, const string & ) ;
// нет, не совсем так
Эта инструкция почти правильна. Проблема в том, что компилятор интерпретирует ее как объявление функции с именем pf, которая возвращает указатель типа int*. Список параметров правилен, но тип возвращаемого значения не тот. Оператор разыменования (*) ассоциируется с данным типом (int в нашем случае), а не с pf. Чтобы исправить положение, нужно использовать скобки:
int (*pf)( const string &, const string & ) ;
// правильно
pf объявлен как указатель на функцию с двумя параметрами, возвращающую значение типа int, т.е. такую, как lexicoCompare().
pf способен адресовать и приведенную ниже функцию, поскольку ее сигнатура совпадает с типом lexicoCompare():
int sizeCompare( const string &sl, const string &s2 );
Функции calc() и gcd()другого типа, поэтому pf не может указывать на них:
int calc( int , int );
int gcd( int , int );
Указатель, который адресует эти две функции, определяется так:
int (*pfi)( int, int );
Многоточие является частью сигнатуры функции. Если у двух функций списки параметров отличаются только тем, что в конце одного из них стоит многоточие, то считается, что функции различны. Таковы же и типы указателей.
int printf( const char*, ... );
int strlen( const char* );
int (*pfce)( const char*, ... ); // может указывать на printf()
int (*pfc)( const char* ); // может указывать на strlen()
Типов функций столько, сколько комбинаций типов возвращаемых значений и списков параметров.