Подтвердить что ты не робот

Каково типичное использование boost любой библиотеки?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

В большинстве случаев мы либо сохраняем объекты-объекты, либо строки, содержащие строки-объекты, а также некоторые записи, в которых используются другие типы (float, vec3f, матрицы и другие нестандартные объекты).

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

Ответ 6

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

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

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 являются членами перечисления, и мы используем шаблон признаков для привязки тегов к типам.

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