Работали ли вы с указателями на функции в C++?

«Работали ли вы с указателями на функции в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, использовал указатели на функции, хотя в современном C++ они часто заменяются более безопасными и выразительными альтернативами.

Базовое использование: Указатель на функцию хранит адрес функции для последующего косвенного вызова. Это полезно для реализации паттернов типа "стратегия" или callback-ов в C-стиле.

#include <iostream>

int add(int x, int y) { return x + y; }
int multiply(int x, int y) { return x * y; }

int main() {
    // Объявление указателя на функцию, принимающую два int и возвращающую int
    int (*operation)(int, int);

    operation = &add; // Можно и просто operation = add;
    std::cout << "5 + 3 = " << operation(5, 3) << std::endl; // Вывод: 8

    operation = multiply;
    std::cout << "5 * 3 = " << operation(5, 3) << std::endl; // Вывод: 15

    return 0;
}

Практический контекст и эволюция:

  1. Указатели на функции-члены: Для работы с методами класса требуются особый синтаксис и учет виртуальности.
  2. std::function: В современном C++ предпочитаю использовать std::function<void(int)> как типобезопасную обертку для любого вызываемого объекта (функция, лямбда, функтор, метод).
  3. Шаблоны и лямбды: Чаще всего вместо явных указателей на функции использую шаблоны, принимающие любой callable-тип, или передаю лямбда-выражения, которые могут захватывать контекст.
    
    // Пример с std::function и лямбдой
    #include <functional>
    #include <vector>

void processNumbers(const std::vector& nums, std::function<int(int)> transformer) { for (int n : nums) { std::cout << transformer(n) << " "; } }

int main() { std::vector vals = {1, 2, 3, 4}; // Передаем лямбду как callable объект processNumbers(vals, [](int x) { return x * x; }); // Вывод: 1 4 9 16 return 0; }


Таким образом, указатели на функции — это фундаментальный механизм, понимание которого важно, но в production-коде я выбираю более современные и безопасные абстракции STL.