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