Hardtype-erasure
Что такое идиома type erasure?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Type erasure — сокрытие конкретного типа за общим интерфейсом при сохранении функциональности. std::function и std::any — классические примеры.
struct Wrapper {
struct Concept { // внутренний интерфейс
virtual ~Concept() = default;
virtual void call(int) = 0;
};
template<typename T>
struct Model : Concept { // реализация для конкретного T
T value;
Model(T v) : value(std::move(v)) {}
void call(int x) override { value(x); }
};
std::unique_ptr<Concept> ptr_;
template<typename T>
Wrapper(T v) : ptr_(std::make_unique<Model<T>>(std::move(v))) {}
void operator()(int x) { ptr_->call(x); }
};
Wrapper w = [](int n) { std::cout << n; };Стоимость: virtual call + heap allocation (со SBO — small buffer optimization). Без type erasure все типы пришлось бы наследовать от общего base.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.