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

Синтаксис

Указатель функции — это просто переменная, которая содержит адрес функции, и вот как мы ее объявляем.

return_type (*pointer_name)(parameter_list);

Синтаксис состоит из трех частей:

  • return_type: функция, на которую мы указываем, возвращает этот тип данных. Например, если функция, которую мы хотим указать, возвращает int, то мы должны использовать int в качестве возвращаемого типа.
  • (*pointer_name): Это просто указывает на то, что мы объявляем указатель с именем pointer_name на функцию.
  • parameter_list: Параметры функции представлены в виде списка, разделенного запятыми. Например, если функция принимает int и string в качестве параметров, мы будем использовать int, string в качестве списка параметров.

Объявление функтора (указатель функции)

int (*func_ptr)(int, string);

Мы только что объявили указатель на функцию, также известный как функтор с именем func_ptr, который указывает на функцию с двумя параметрами int, string и возвращает целое число.

Теперь мы можем присвоить функтору адрес любого функтора с параметрами int, string, используя оператор &.

func_ptr = &my_function;

Если вы думаете, что это слишком сложно, есть альтернативный способ присвоить функции переменной.

auto func_ptr = &my_function;

Да, он использует автоматическое ключевое слово. Ключевое слово auto обычно используется для автоматического определения типа переменной на основе ее инициализатора. Ключевое слово auto также можно использовать для упрощения синтаксиса объявления функтора.

Вызов функтора

Чтобы вызвать функцию с помощью указателя, мы используем следующий синтаксис:

int result = (*func_ptr)(arg1, arg2);
int result = func_ptr(arg1, arg2);

Это вызовет функцию, на которую указывает func_ptr, с аргументами arg1 и arg2, и сохранит результат в переменной result.

В C++ указатели на функции имеют множество применений и являются эффективным инструментом для создания кода, который является одновременно гибким и пригодным для повторного использования.