Каково типичное использование boost любой библиотеки? - PullRequest
20 голосов
/ 23 апреля 2009

Каковы преимущества использования библиотеки boost.any? Не могли бы вы привести примеры из жизни? Почему та же функциональность не может быть достигнута при наличии какого-либо общего типа в корне иерархии объекта и создании контейнеров с этим базовым типом?

Ответы [ 6 ]

23 голосов
/ 23 апреля 2009

boost :: any с радостью будет хранить целые числа и числа с плавающей запятой, типы, которые явно не имеют базовых классов. Пример из реальной жизни, где вы можете использовать его, - это виртуальная машина для интерпретируемого языка высокого уровня. Вашим "функциональным" объектам потребуется массив аргументов. Это легко реализовать с помощью std::list<boost::any> за кадром.

8 голосов
/ 23 апреля 2009

Я считаю, что Boost.Variant всегда следует отдавать предпочтение, поскольку он не навязчив и все еще требует очень структурированного программирования.

Но я думаю, что основная идея boost.any - предоставить эквивалент типов объектов java и c #. Это способ сказать "да, мы можем"! : -)

6 голосов
/ 24 апреля 2009

Когда я впервые узнал о Бусте, я обнаружил эту статью Херба Саттера и Джима Хислопа в книге Доктора Доббса. Я нашел это полезным.

4 голосов
/ 23 апреля 2009

Мы использовали его на карте свойств (std::map<std::string, boost::any>) для динамического хранения многих вещей в простом плоском пространстве данных.

В основном мы храним объекты или строки типа smart-ptr-to-scriptable или строки, но некоторые записи содержат другие типы (float, vec3f, матрицы и другие нестандартные объекты).

Он очень хорошо работает для добавления дополнительных динамических возможностей в c ++ или в тех случаях, когда вы хотите, чтобы какое-либо стирание типов просто добавляло данные любого типа в объект.

3 голосов
/ 23 апреля 2009

Почему ту же функциональность невозможно реализовать, если в корне иерархии объекта есть какой-то универсальный тип и создать контейнеры с этим базовым типом?

Это вызывает иерархию объектов - конструкцию, которую вы искусственно вводите в проект для решения периферийной проблемы. Кроме того, такую ​​конструкцию легко ошибиться, а неправильная реализация может нанести ущерб. Boost.Any - это безопасная, проверенная на практике альтернатива.

Не могли бы вы привести примеры из жизни?

TinyJSON использует boost.Any.

Каковы преимущества использования библиотеки boost.any?

Я ссылаюсь на вводную документацию.

2 голосов
/ 23 апреля 2009

Мы используем boost.any в качестве типа носителя для безопасного контейнера с тегами типа variadic. Вот что это значит:

У нас есть "плот" объект, который проходит через набор фильтров. Когда фильтр хочет добавить данные в плот, он может сделать что-то вроде этого:

raft.addTaggedData<ETag1>(3.0);
raft.addTaggedData<ETag2>("a string")`;
std::string str = raft.getTaggedData<ETag2>();
int a = raft.getTaggedData<ETag1>(); // <-- Compile error

Где ETag1 и ETag2 являются членами перечисления, и мы используем шаблон признаков для отображения тегов на типы.

Класс плота использует list из pair<ETagType, boost::any> в качестве резервного хранилища. Boost.any избавил нас от необходимости управлять необработанными буферами для различных типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...