Разница между boost::any
и boost::variant
в том, что any
может хранить любой тип, тогда как variant
может хранить только один из набора перечислимых типов. Тип any
хранит указатель void*
на объект, а также объект typeinfo
для запоминания базового типа и обеспечения некоторой степени безопасности типов. В boost::variant
он вычисляет объект максимального размера и использует «размещение нового» для размещения объекта в этом буфере. Он также хранит тип или индекс типа.
Обратите внимание, что если у вас установлен Boost, вы сможете увидеть исходные файлы в "any.hpp" и "option.hpp". Просто ищите «include / boost / variable.hpp» и «include / boost / any.hpp» в «/ usr», «/ usr / local» и «/ opt / local», пока не найдете установленные заголовки, и Вы можете взглянуть.
Редактировать
Как было отмечено в комментариях ниже, в моем описании boost :: any была небольшая неточность. Хотя это может быть реализовано с использованием void*
(и шаблонного обратного вызова уничтожения для правильного удаления указателя), в действительности реализация использует any<T>::placeholder*
, с any<T>::holder<T>
в качестве подклассов any<T>::placeholder
для унификации типа.