В чем преимущества использования библиотеки boost.any? Не могли бы вы привести несколько примеров реальной жизни? Почему такая же функциональность не может быть достигнута за счет наличия определенного типа в корне иерархии объектов и создания контейнеров с этим базовым типом?
Каково типичное использование boost любой библиотеки?
Ответ 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 избавил нас от необходимости управлять буферами сырья для разных типов.