Hardvariant
Что такое SBO/std::variant как альтернатива полиморфизму?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
std::variant<T1,T2,...> — sum type, хранит один из перечисленных типов. Альтернатива runtime-полиморфизму через inheritance+virtual: вместо Base* с Derived1/2/3 — variant<Derived1,Derived2,Derived3>.
struct Circle { double r; double area() const { return 3.14*r*r; } };
struct Square { double s; double area() const { return s*s; } };
struct Triangle{ double b, h; double area() const { return 0.5*b*h; } };
using Shape = std::variant<Circle, Square, Triangle>;
double area(const Shape& sh) {
return std::visit([](const auto& s) { return s.area(); }, sh);
}
Shape s = Circle{2.0};
area(s); // 12.56- Преимущества: value semantics (копирование, stack allocation), нет vtable, exhaustive visiting через
std::visit; - Недостатки: размер =
max(sizeof Ti)+ tag, все типы известны в месте объявления; - «Expression problem»: virtual хорошо для добавления операций, variant — для добавления типов.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.