Это функции, которые передаются как аргументы другим функциям, чтобы быть вызванными в определенный момент. Это важный механизм в программировании, который позволяет реализовывать гибкие и модульные решения, особенно в контексте асинхронного программирования, обработчиков событий и многопоточности.
Функции обратного вызова передаются как параметры другим функциям.
Они вызываются внутри функции, которая их получила, в определенный момент времени или по определенному условию.
Использование функций обратного вызова позволяет легко изменять поведение программы без необходимости изменения основной функции.
В языке C функции обратного вызова обычно реализуются с использованием указателей на функции.
#include <stdio.h>
// Объявление функции обратного вызова
void callback_function(int value) {
printf("Callback called with value: %d\n", value);
}
// Функция, принимающая указатель на функцию в качестве параметра
void process_value(int value, void (*callback)(int)) {
// Некоторая обработка
value *= 2;
// Вызов функции обратного вызова
callback(value);
}
int main() {
int x = 5;
// Передача функции обратного вызова
process_value(x, callback_function);
return 0;
}
В C++ можно использовать указатели на функции, объекты-функции (functors) и лямбда-функции в качестве функций обратного вызова.
#include <iostream>
#include <functional>
// Функция обратного вызова
void callback_function(int value) {
std::cout << "Callback called with value: " << value << std::endl;
}
// Функция, принимающая std::function в качестве параметра
void process_value(int value, std::function<void(int)> callback) {
// Некоторая обработка
value *= 2;
// Вызов функции обратного вызова
callback(value);
}
int main() {
int x = 5;
// Использование указателя на функцию
process_value(x, callback_function);
// Использование лямбда-функции
process_value(x, [](int val) {
std::cout << "Lambda callback called with value: " << val << std::endl;
});
// Использование объекта-функции
struct Functor {
void operator()(int val) {
std::cout << "Functor callback called with value: " << val << std::endl;
}
};
Functor functor;
process_value(x, functor);
return 0;
}
Функции обратного вызова широко используются в асинхронном программировании, где задачи выполняются параллельно или по завершении некоторых событий. Это позволяет программе не блокироваться, ожидая завершения длительных операций.
Пример с асинхронным вызовом
#include <iostream>
#include <thread>
// Функция обратного вызова
void callback_function() {
std::cout << "Async operation completed" << std::endl;
}
// Асинхронная функция
void async_operation(std::function<void()> callback) {
std::thread([callback]() {
// Имитация длительной операции
std::this_thread::sleep_for(std::chrono::seconds(2));
// Вызов функции обратного вызова
callback();
}).detach();
}
int main() {
std::cout << "Starting async operation..." << std::endl;
async_operation(callback_function);
// Основной поток продолжает выполнять свою работу
std::cout << "Main thread continues..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
return 0;
}
Ставь 👍 и забирай 📚 Базу знаний