Мне просто интересно boost::variant
Реализация.
Это работает так?
Два члена:
apply_visitor()
:
Имеет switch
оператор числа, представляющего текущий сохраненный тип, для вызова корректной перегрузки (в худшем случае это будет скомпилировано как таблица переходов, поэтому потребуется постоянное время).
Я понимаю, что есть также ряд оптимизаций, которые могут быть уверены, boost::variant
не нужно динамически распределять память как подробно Вот, но я думаю, что я получаю это.
Это работает так же, как вы описали. Короче:
Имеет целое число which
это указывает, какой тип данных используется.
Хранилище реализовано с использованием буста aligned_storage
который в основном является буфером максимального размера данных. (это в союзе, но для выравнивания)
Наконец, посетитель действительно реализован с switch
, сгенерированный во время компиляции с использованием макросов для развертывания всех возможностей типа.
Других решений пока нет …