boost :: вариант реализации

Мне просто интересно boost::variantРеализация.

Это работает так?

Два члена:

  1. Число, представляющее текущий сохраненный тип (то есть 0 для первого параметра шаблона, 1 для второго параметра шаблона и т. Д.)
  2. Объединение всевозможных типов (которые, конечно, по размеру самые большие).

apply_visitor():

Имеет switch оператор числа, представляющего текущий сохраненный тип, для вызова корректной перегрузки (в худшем случае это будет скомпилировано как таблица переходов, поэтому потребуется постоянное время).

Я понимаю, что есть также ряд оптимизаций, которые могут быть уверены, boost::variant не нужно динамически распределять память как подробно Вот, но я думаю, что я получаю это.

9

Решение

Это работает так же, как вы описали. Короче:

  1. Имеет целое число which это указывает, какой тип данных используется.

  2. Хранилище реализовано с использованием буста aligned_storage который в основном является буфером максимального размера данных. (это в союзе, но для выравнивания)

Наконец, посетитель действительно реализован с switch, сгенерированный во время компиляции с использованием макросов для развертывания всех возможностей типа.

7

Другие решения

Других решений пока нет …