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

17

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

    
задан Konstantin 23.04.2009 в 11:41
источник

6 ответов

6

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

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

    
ответ дан Benoît 23.04.2009 в 13:53
источник
  • Boost.Variant не может заменить Boost.Any в том случае, если тип, который будет удерживаться, известен во время выполнения. Например, см. Ссылку, упомянутую в комментарии SCFrench: ddj.com/cpp/184403808 –  amit_grepclub 08.12.2010 в 14:16
  • -1. Boost.any может хранить все типы, даже примитивные, а не только эквиваленты c # / java. –  Macke 22.10.2014 в 08:29
  • @Macke Не говорите C # / java в этом случае. C # (CLR) может хранить примитивное значение в объекте. Языки могут выглядеть схожими, но они различаются. –  erikkallen 28.11.2014 в 22:46
21

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

    
ответ дан MSalters 23.04.2009 в 11:49
источник
5

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

    
ответ дан SCFrench 24.04.2009 в 03:36
источник
3
  

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

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

  

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

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

  

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

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

    
ответ дан dirkgently 23.04.2009 в 11:53
источник
  • Чтобы представить JSON в C ++ boost :: variant <T ...>, на мой взгляд, лучший выбор. –  jk. 23.04.2009 в 12:04
  • Я не писал эту библиотеку :-) Уверен, что у вас есть веские причины. –  dirkgently 23.04.2009 в 12:10
3

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

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

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

    
ответ дан Macke 23.04.2009 в 19:41
источник
2

Мы используем 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 pair<ETagType, boost::any> в качестве хранилища резервных копий. Boost.any избавил нас от необходимости управлять буферами сырья для разных типов.

    
ответ дан Ben Straub 23.04.2009 в 16:12
источник
  • Используя бит boost.MPL, вы можете использовать boost.Variant вместо Boost.Any. –  Benoît 23.04.2009 в 17:10
  • Даже с использованием boost.any было даже немного растягиваться; моя команда консервативна, когда дело доходит до функций C ++. Плюс, я еще не узнал MPL. :) –  Ben Straub 24.04.2009 в 03:49
  • @ Benoît Boost.Variant потребует, чтобы плот знал все возможные теги (или, по крайней мере, их типы значений). Это может быть невозможно, если, например, плот плавает через независимые модули, которые таким образом могут хранить частные данные. Или даже если это возможно, это может быть нежелательно из-за увеличения исходных зависимостей, подразумеваемых таким образом. Хотя Boost.Any увеличивает затраты времени на запуск, поэтому это компромисс. –  Adam Badura 15.02.2017 в 23:17