Указатель на функцию
Синтаксис:
тип возврата (*имя указателя)(спецификация параметров);
Пример:
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);
Кстати это пример полиморфизма, нашей функции абсолютно безразлично какую функцию вызывать, лишь бы её сигнатура совпадала с сигнатурой указателя.