Как дискриминируемый профсоюзный контейнер, библиотека Variant разделяет многие из тех же особенностей библиотеки Any. Однако, поскольку ни одна библиотека полностью не инкапсулирует особенности другой, одна библиотека не может быть обычно рекомендована для использования над другой.
Это сказал: "Боуст". Вариант имеет несколько преимуществ перед Boost. Любые, такие как:
Подъем. Вариант гарантирует, что тип его контента является одним из конечного, определяемого пользователем набора типов.
Boost.Variant предоставляет compile-time проверенное посещение его содержания. (С другой стороны, текущая версия Boost. Любой не предоставляет механизма посещения вообще; но даже если это так, его нужно будет проверить в режиме ожидания.)
Подъем. Вариант позволяет общее посещение его содержания. (Даже если подогнать. Любой из них предоставляет механизм посещения, он позволяет посещать только специально определенные типы.)
Подъем. Variant предлагает эффективную схему хранения на основе стека (избегая накладных расходов динамического распределения).
Конечно, "Боуст". Любой имеет несколько преимуществ перед Boost. Разнообразные, такие как:
Подъем. Любое, как подразумевает его название, позволяет практически любой тип для его содержания, обеспечивая большую гибкость.
Подъем. Любое лицо предоставляет гарантию безопасности исключений для своей операции по обмену.
Подъем. Любой из них мало использует методы метапрограммирования шаблонов (избегая потенциально труднодоступных сообщений об ошибках и значительных требований процессора и памяти).
Portability
Библиотека предназначена для 100% соответствия ANSI/ISO C++. Тем не менее, это строго невозможно из-за неотъемлемо непортируемого характера объекта библиотеки Type Traits type_with_alignment. На практике, однако, не было обнаружено никаких компиляторов или платформ, где эта зависимость от неопределенного поведения была проблемой.
Кроме того, были предприняты значительные усилия для обеспечения надлежащего функционирования, несмотря на различные ошибки компиляторов и другие проблемы соответствия. На сегодняшний день библиотечные тесты были составлены и успешно протестированы по крайней мере на следующих компиляторах для основной и продвинутой функциональности:
Наконец, текущее состояние теста в CVS можно найти на странице Test Summary. Однако, пожалуйста, обратите внимание, что эта страница сообщает о ежедневных изменениях в межрелизном коде, найденном в Boost CVS, и, следовательно, вероятно, не соответствует состоянию кода, обнаруженного в Boost-релизах.
Из-за интенсивного использования шаблонов в реализации variant, это не редкость при компиляции, чтобы столкнуться с проблемами, связанными с глубиной шаблона, памятью компилятора и т. Д. В этом разделе делается попытка дать советы общим проблемам, с которыми сталкиваются несколько популярных компиляторов.
(Этот раздел все еще находится в стадии разработки, с дополнительными рекомендациями/отзывами. Пожалуйста, отправьте в список Boost-Users с любым полезным опытом, который вы можете иметь.)
Вариант компилятора /ZmNNN может увеличить лимит распределения памяти. NN - это процент масштабирования (т.е. 100 обозначает предел по умолчанию). (Try /Zm200.)
Acknowledgments
Эрик Фридман и Итей Маман разработали первоначальное представление; Эрик был основным исполнителем.
Эрик также является хранителем библиотеки и расширился после первоначального представления - добавив make_recursive_variant, make_variant_over, поддержку исходного контента и т.д.
Работы Андрея Александреску в [Ale01a] и [Ale02] вдохновили дизайн библиотеки.
Джефф Гарланд был официальным менеджером по обзору.
Дуглас Грегор, Дэйв Абрахамс, Энтони Уильямс, Фернандо Качиола, Джоэл де Гузман, Дирк Шрейб, Брэд Кинг, Джованни Баджо, Юджин Гладышев и другие предоставили полезные отзывы и предложения по уточнению семантики, интерфейса и реализации библиотеки.
Статья Miscellaneous Notes раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 42. Boost.Variant может быть полезна для разработчиков на c++ и boost.