Научиться передавать функции как аргументы в другие функции, хранить их в переменных и использовать современные лямбда-выражения.
Указатель на функцию — это переменная, которая хранит адрес функции. Через неё можно вызывать функцию так же, как через её имя.
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
// Указатель на функцию: (тип_возврата)(*имя)(параметры)
int (*funcPtr)(int, int);
funcPtr = add;
cout << funcPtr(5, 3); // 8
funcPtr = subtract;
cout << funcPtr(5, 3); // 2
Позволяет сделать функцию гибкой: поведение задаётся снаружи.
int calculate(int a, int b, int (*operation)(int, int)) {
return operation(a, b);
}
cout << calculate(10, 5, add); // 15
cout << calculate(10, 5, subtract); // 5
Более удобная обёртка для функций (и лямбд). Требует #include <functional>.
#include <functional>
function<int(int, int)> op;
op = add;
cout << op(10, 5); // 15
Лямбда — это анонимная функция (без имени). Синтаксис: [](параметры) { тело }.
auto square = [](int x) {
return x * x;
};
cout << square(5); // 25
Лямбды можно передавать как callback:
calculateFunc(10, 5, [](int a, int b) { return a + b; });
#include <algorithm>
// Сортировка по убыванию
sort(nums.begin(), nums.end(), [](int a, int b) {
return a > b;
});
- Передача функции как аргумента (callbacks).
- Выбор функции во время выполнения.
- Сортировка с пользовательским сравнением.
- Обработка событий (кнопки, меню).
- function_pointers.cpp — все примеры из урока
Урок 22 (бонусный) — многопоточность.