Mediumcallback
Чем std::function удобен и какие накладные расходы?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
std::function<Signature> — type-erased обёртка над любым вызываемым (function pointer, lambda, functor, member function). Единый тип для callback'ов.
#include <functional>
std::function<void(int)> cb = [](int x) { std::cout << x; };
cb = freeFunction; // тоже работает
cb = std::bind(&Class::method, &obj, std::placeholders::_1);
std::vector<std::function<void(int)>> callbacks; // можно хранить в контейнере- sizeof обычно 32-48 байт; вызов через indirection (нельзя inline);
- Копирование может аллокировать, если callable больше SBO buffer (~16-24 байта);
- Применение: хранение callback'ов, события, plugin API;
- Когда можно — template callback
template<class F> void setOnClick(F&& cb)эффективнее (inline, без type erasure).
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.