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-функции — это мощный механизм, который позволяет:
-
Создавать гибкие и расширяемые системы
-
Реализовывать асинхронную логику
-
Разрабатывать модульные компоненты