Callback-функции
Callback-функции (функции обратного вызова) — это функции, передаваемые в качестве аргументов другим функциям и вызываемые при наступлении определённых событий.
Основные концепции callback-функций
Что такое callback?
Callback — это:
-
Функция, передаваемая в другую функцию как параметр
-
Механизм обратного вызова при наступлении события
-
Альтернатива полиморфизму в процедурном программировании
Где применяются callback-и?
-
Обработка событий (GUI, игры)
-
Асинхронные операции (сетевое программирование)
-
Алгоритмы с пользовательской логикой (сортировка, поиск)
-
Механизмы подписки и уведомлений
Реализация callback-ов
Указатели на функции (C-стиль):Пояснение:
-
typedef void (*CallbackType)(int)
-
Создаём тип для указателя на функцию, которая принимает
int
и возвращаетvoid
-
Аналогично:
using CallbackType = void(*)(int)
-
-
Функция
processData
-
Принимает число и callback-функцию
-
Умножает число на 2 и передаёт результат в callback
-
-
Функция
printResult
-
Просто выводит полученное значение
-
Это и есть наша callback-функция
-
-
Вызов в
main
-
Передаём
printResult
как callback -
Функция
processData
вызывает её с результатом 10 (5*2)
-
std::function (современный C++): Более гибкий и безопасный способ:
Пояснение:
-
std::function<void(int)>
-
Универсальный контейнер для любых вызываемых объектов (функции, лямбды, функторы)
-
Принимает
int
, возвращаетvoid
-
-
Лямбда-функция
-
[](int result) { ... }
— анонимная функция, захватывающая ничего ([]
) -
Выводит полученный результат
-
-
Преимущества перед C-стилем
-
Безопаснее (нет сырых указателей)
-
Поддерживает лямбды с захватом переменных
-
Более читаемый синтаксис
-
Функциональные объекты (функторы):
Пояснение:
-
struct Callback
-
Создаем структуру с именем
Callback
(можно использовать иclass
) -
В C++ структуры и классы почти идентичны, разница только в дефолтной видимости (у struct - public)
-
-
void operator()(int x) const
-
Перегружаем оператор вызова функции
()
-
Позволяет использовать объект как функцию
-
Принимает целочисленный параметр
x
-
const
означает, что метод не изменяет состояние объекта
-
-
Тело оператора
-
Просто выводит полученное значение в формате: "Functor: x"
-
-
Параметры:
-
int x
- значение для обработки -
const Callback& cb
- принимаем функтор по константной ссылке (оптимально для передачи объектов)
-
-
Вызов
cb(x)
-
Хотя
cb
- это объект, благодаря перегруженномуoperator()
мы можем вызывать его как функцию -
Эквивалентно
cb.operator()(x)
, но записывается короче
-
Производительность и оптимизация
Сравнение подходов
Метод | Гибкость | Производительность | Безопасность |
---|---|---|---|
Указатели на функции | Низкая | Высокая | Низкая |
std::function | Высокая | Средняя | Высокая |
Функторы | Средняя | Высокая | Высокая |
Когда что использовать?
-
Указатели на функции: Когда нужна максимальная производительность и простота
-
std::function: В большинстве случаев, особенно с лямбдами
-
Функторы: Когда нужно сохранять сложное состояние
Callback-функции — это мощный механизм, который позволяет:
-
Создавать гибкие и расширяемые системы
-
Реализовывать асинхронную логику
-
Разрабатывать модульные компоненты