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 подскажет развёрнутый ответ в реальном времени.