🤔 Что такое функции обратного вызова?



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



🚩Основные характеристики



🟠Передача как параметр

Функции обратного вызова передаются как параметры другим функциям.

🟠Вызов в определенный момент

Они вызываются внутри функции, которая их получила, в определенный момент времени или по определенному условию.

🟠Гибкость и расширяемость

Использование функций обратного вызова позволяет легко изменять поведение программы без необходимости изменения основной функции.



🟠Пример на С

В языке 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++

В 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;

}




Ставь 👍 и забирай 📚 Базу знаний