(источник из здесь .)
Обозначение квадратной скобки позволяет использовать символы, которые нельзя использовать с точечной нотацией:
blockquote>var foo = myForm.foo[]; // incorrect syntax var foo = myForm["foo[]"]; // correct syntax
Во-вторых, обозначения квадратной скобки полезны при работе с именами свойств, которые меняются предсказуемым образом:
blockquote>for (var i = 0; i < 10; i++) { someFunction(myForm["myControlNumber" + i]); }
Roundup:
blockquote>
- Точечная запись быстрее записывается и читается.
- Обозначение квадратной скобки позволяет получить доступ к свойствам, содержащим специальные символы и выбор свойств с использованием переменных
Другим примером символов, которые нельзя использовать с точечной нотацией, являются имена свойств , которые сами содержат точку .
Например, Ответ json может содержать свойство, называемое
bar.Baz
.var foo = myResponse.bar.Baz; // incorrect syntax var foo = myResponse["bar.Baz"]; // correct syntax
Я считаю, что Boost.Variant всегда должен быть предпочтительным, поскольку он не является навязчивым и все еще требует очень структурированного программирования.
Но я предполагаю, что основная идея boost.any - предоставить эквивалент типов объектов java и c #. Это способ сказать «да, мы можем»! : -)
Мы используем 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 спасли нам боль от управления буферами сырья для разных типов.
Почему одна и та же функциональность не может быть достигнута за счет наличия определенного типа в корне иерархии объекта и создания контейнеров с этим базовым типом?
blockquote>Это вызывает иерархию объектов - конструкция, которую вы искусственно впрыскиваете в конструкцию для решения периферийной проблемы. Кроме того, такая конструкция легко ошибиться, и неправильная реализация может нанести ущерб.
Boost.Any
- сообщество рассмотрело безопасную, хорошо протестированную альтернативу.Не могли бы вы привести несколько примеров реальной жизни?
blockquote>TinyJSON использует
boost.Any
.В чем преимущества использования библиотеки boost.any?
blockquote>Я ссылаюсь на вводную документацию.
boost::variant<T...>
, на мой взгляд, лучший выбор.
– jk.
23 April 2009 в 11:04
Мы использовали его на карте свойств (std::map<std::string, boost::any>
), чтобы динамически хранить много вещей в простой плоской дате.
В основном мы либо храним smart-ptr-to- сценариев-объектов или строк, но некоторые записи, в которых используются другие типы (float, vec3f, матрицы и другие нестандартные объекты).
Он отлично работает для добавления дополнительных динамических возможностей на c ++ или где угодно некоторое стирание типа, чтобы просто добавлять любые типы данных к объекту.
boost :: any будет с удовольствием хранить int и floats, типы, у которых явно нет базовых классов. Реальный пример, где вы можете использовать его, - это виртуальная машина для высокоуровневого языка. Объектам «функции» потребуется массив аргументов. Это можно легко реализовать с помощью std::list<boost::any>
за кулисами.
Когда я впервые узнал о Boost, я нашел эту статью Хербом Саттером и Джимом Хислопом в докторе Доббсе. Я нашел это полезным.