boost::any позволяет хранить переменные различных типов без явного указания типа, например так:
В том, что boost::any позволяет создавать вектор "зоопарка-элементов" нет ничего удивительного. Реализация этого класса предельна проста - он просто напросто хранит указатель на класс-холдер конкретного типа. Самое примечательное, что есть в boost::any - это шаблонный конструктор и шаблонный оператор присваивания:
Сразу же надо уточнить, что шаблонный конструктор и шаблонный оператор присваивания не могут быть конструктором копирования и оператором присваивания (их нужно определять отдельно). Эти шаблонные методы позволяют производить присваивание и инициализацию объекта класса boost::any без явного указания типа. Такой подход очень удобен и применяется в stl-контейнерах и различных smart-pointer'ах. Есть даже такая идеома - Coercion by Member Template.
Тип содержимого указывается только при получения значения из контейнера типа. Для этого boost предоставляет шаблонную функцию boost::any_cast, которая сранивает желаемый и реальный типы на основании std::type_info, и в зависимости от результата либо получает конкретное значение у холдера, используя static_cast, либо бросает исключение.
Вот так вот просто и красиво решается задача хранения значений различного типа в одном контейнере.
ЗЫ: забыл как пишется изнутри, вместе или раздельно... :)
четверг, 13 декабря 2007 г.
boost::any изнутри
Автор: sash_ko на 19:27
Ярлыки: Программизм, C++
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий