Skip to the content.

Указатель на функцию


Синтаксис:

тип возврата (*имя указателя)(спецификация параметров);

Пример:

void Foo1()
{
    std::cout << "void Foo1()" << endl;
}

int Foo2(int a)
{
    return a * a;
}
void (*fptr)(); // указатель на функцию без параметров, которая ничего не возвращает
fptr = Foo1;    // присвоить указателю ссылку на функцию
fptr();         // вызвать функцию по указателю

int (*fptr2)(int); // можно писать (int a), можно просто (int)
fptr2 = Foo2;
fptr2();

Никто конечно так указатели не использует.

Более реальный пример:

Допустим есть две функции: одна возвращает данные из БД, вторая возвращает данные из веб-сервера:

std::string getDataFromDB();
std::string getDataFromWebServer();

Соответственно мы должны как-то реализовать в своей функции ветвление через “костыли”:

void showInfo(bool isFromBD)
{
    if (isFromBD) std::cout << getDataFromDB();
    else std::cout << getDataFromWebServer();
}

Казалось бы, все отлично работает. Однако что если подобных функций в будущем бесконечное множество (помимо БД и веба будет файл, диктофон, фото и т.д.), не городить же if’ы. Да, можно теперь принимать int вместо bool и использовать снова switch..case для красоты, но тогда каждому пользователю нашей функции прийдёться знать какому int’у какая функция соответствует, это неудобно. Проблема решается указателем на функцию:

void showInfo(std::string (*fptr)())
{
    std::cout << fptr();
}

// как использовать:
showInfo(getDataFromBD);

Кстати это пример полиморфизма, нашей функции абсолютно безразлично какую функцию вызывать, лишь бы её сигнатура совпадала с сигнатурой указателя.