Каково типичное использование 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
источник
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
источник
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
источник