Классический полиморфизм и std::variant (C++17).
Интересная статья натолкнула на попытку сравнения производительности кода, использующего старый, основанный на наследовании и виртуальных функциях полиморфизм и новый подход, использующий std::variant, появившийся в стандарте C++17. Итак имеем типы, связанные наследованием от общего предка - абстрактного класса: struct ShapeAbstract { virtual void Print() = 0; virtual double Area() = 0; virtual ~ShapeAbstract() {}; }; struct CircleVirt : ShapeAbstract { CircleVirt(double val) : radius(val) {} void Print() override { cout << "CircleVirt. " << "Radius: " << radius << endl; } double Area() override { return 3.14 * radius * radius; } double radius; }; struct SquareVirt : ShapeAbstract { SquareVirt(double val) : side(val) {} void Print() override { cout << "SquareVirt. Side: " << side << endl; } ...