Mediumcallback
Что такое std::function и когда использовать?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
std::function<Signature> — type-erased обёртка над всем вызываемым с сигнатурой Signature (function pointer, lambda, functor, member function pointer). Единый тип для хранения callback’ов.
std::function<int(int)> cb;
cb = [](int x) { return x * 2; }; // lambda
cb = std::bind(&Foo::method, &obj, _1); // bind
int r = cb(5); // r = 10
// хранение callback в поле класса
class Button {
std::function<void()> onClick_;
public:
void setOnClick(std::function<void()> cb) { onClick_ = std::move(cb); }
};- Overhead: type erasure через indirection, копирование может аллокировать;
sizeof std::functionобычно 32–48 байт;- Когда можно — template callback (
template<class F> void setOnClick(F&& cb)) эффективнее.
В performance-critical коде — заменять на шаблон или function_ref (C++26).
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.