Некоторые преимущества использования std::variant по сравнению с виртуальными функциями:
- Возможность работы с несвязанными типами, включая встроенные функции, что невозможно напрямую с виртуальными функциями. stackoverflow.com
- Отсутствие динамической аллокации, что может улучшить производительность системы. habr.com
- Лёгкость добавления нового «метода»: нужно реализовать новую вызываемую структуру, нет необходимости изменять реализацию классов. habr.com www.cppstories.com
- Отсутствие базового класса, классы могут быть не связанными. habr.com www.cppstories.com
- Гибкость: у вызываемых функций может быть разное количество аргументов, типов возвращаемых значений и т. д.. habr.com www.cppstories.com
Некоторые недостатки использования std::variant по сравнению с виртуальными функциями:
- Необходимость знать все типы заранее, во время компиляции. habr.com www.cppstories.com Это исключает возможность создания таких конструкций, как система плагинов. habr.com
- Сложность добавления новых типов, так как это подразумевает изменение типа variant и всех посетителей. habr.com www.cppstories.com
- Избыточное потребление памяти, так как std::variant имеет размер, равный максимальному размеру поддерживаемых типов. habr.com www.cppstories.com
- Для каждой операции требуется писать отдельного посетителя, иногда их организация может быть проблемой. habr.com
- Передача параметров не так проста, как с обычными функциями, поскольку std::visit не имеет для этого интерфейса. habr.com
Однозначного ответа на вопрос, что лучше: полиморфизм на основе std::variant или «виртуальный» полиморфизм, нет, так как у обоих подходов есть свои сильные и слабые стороны. habr.com