Динамические интерфейсы карты свойств обеспечивают доступ к коллекции карт недвижимости через динамический интерфейс. Алгоритм может использовать его для манипулирования картами собственности, не зная их ключевых или типов ценностей в компиляционное время. Тип-безопасные коды могут использовать динамические карты свойств для более легкого и полного взаимодействия с языками сценариев и другими текстовыми представлениями данных ключевых значений.
Увеличить собственность Библиотека карт определяет статически безопасные интерфейсы, через которые пары ключевых значений могут управляться общими алгоритмами. Как правило, алгоритм, использующий карты собственности, параметризируется на типах используемых карт собственности, и он манипулирует ими с использованием интерфейсов, указанных библиотекой Boost Property Map.
Следующая общая функция иллюстрирует основы карты недвижимости.
Функция параметризирована на двух типах карт недвижимости, AgeMap и GPAMap, и занимает параметр значения для каждого из этих типов. Функция использует интерфейс property_traits, чтобы установить, в момент компиляции, значение и ключевые типы карт недвижимости. Затем код получает старую информацию Фреда, используя функцию get, и обновляет ее с помощью функции put. Функция get требуется в соответствии с концепцией читаемой Карты недвижимости, и как get, так и put требуются в концепции Карты недвижимости Read/Write.
Вышеупомянутая функция не только требует двух параметров типа для моделирования концепций карты собственности, но и делает некоторые дополнительные предположения. AgeMap и GPAMap должны иметь один и тот же тип ключа, и этот тип должен быть конструируем из строки. Кроме того, тип значений AgeMap должен быть конструируем из int. Хотя эти требования явно не указаны, они статически проверяются во время компиляции и невыполнение их приводит к ошибкам в компиляционном времени.
Хотя статическое печатание интерфейсов карты свойств обычно обеспечивает желаемую безопасность времени компиляции, некоторые алгоритмы требуют более динамичного интерфейса к картам свойств. Например, Библиотека графа Boost (BGL) предоставляет функции, которые могут инициализировать граф, интерпретируя содержимое текстового описания графа (т.е. файла GraphML). Такие языки описания графа общего назначения могут указывать произвольное количество реберных и вершинных свойств, используя строки для представления пар ключевых значений. Функция чтения графов должна захватывать эти произвольные свойства, но поскольку шаблоны функций могут быть параметризированы только на фиксированном количестве карт недвижимости, традиционных методов обработки карт недвижимости недостаточно для их реализации.
Динамические карты недвижимости конкретно направлены на необходимость интерфейса для карт недвижимости, проверка которых откладывается до времени работы. Несколько компонентов объединяются для поддержки динамических карт недвижимости. dynamic_properties класс собирает группу гетерогенных объектов, которые моделируют концепции из библиотеки Boost Property Map. Каждая карта свойств присваивается строковым ключом, когда он добавляется к коллекции, и его можно адресовать с помощью этого ключа. Внутри dynamic_properties адаптирует каждую содержащуюся карту свойств с интерфейсом карты динамических свойств, который предоставляет get и put функции, которые можно назвать с использованием значений любого типа, которые отвечают нескольким требованиям. Внутренняя карта динамических свойств преобразует пары ключей и значений для удовлетворения требований базовой карты свойств или сигнализирует о временном исключении, если оно не может.
Новая функция не является шаблоном, параметризованным на типах карт недвижимости, а вместо этого конкретной функцией, которая занимает объект dynamic_properties. Кроме того, код больше не содержит ссылки на ключевые или типы значений: ключи и значения представлены строками. Тем не менее, функция по-прежнему использует нестрочные типы, где они полезны. Например, старый возраст Фреда представлен с использованием int. get с параметром типа, который определяет его тип возврата. Наконец, функции get и put поставляются по строковому ключу, который отличается в зависимости от объекта беспокойства.
Вот пример того, как вышеупомянутую функцию можно назвать.
Код сначала создает две карты свойств с использованием std::map и associative_property_map адаптер. После инициализации карт недвижимости с данными ключевых значений, он создает объект dynamic_properties и добавляет к нему обе карты свойств, заложенные на строках "age" и "gpa& " . Наконец, manipulate_freds_info передается объект dynamic_properties и отображаются результаты его изменений.
Как показано выше, объект dynamic_properties предоставляет, где это необходимо, динамический интерфейс к картам свойств, но сохраняет статическую типизацию карты свойств, используемой в другом месте в приложении.
Класс dynamic_properties обеспечивает динамический интерфейс для набора карт недвижимости. Чтобы использовать его, необходимо заселить объект этого класса картами свойств с использованием функции property.
Объект dynamic_properties может быть построен с функциональным объектом, который при вызове создает новую карту свойств. Библиотека предоставляет объект функции ignore_other_properties, который позволяет объекту dynamic_properties игнорировать любые свойства, которые он не был готов записывать. Если сделана попытка put пары ключевых значений к несуществующему ключу dynamic_properties, то эта функция называется с ключом dynamic_properties и предполагаемым ключом свойств и значением. Если dynamic_properties является по умолчанию структурированным, такой put попытаться бросить property_not_found.
Эта функция-член непосредственно добавляет к коллекции dynamic_property_map, используя name в качестве ключа.
iterator begin()
const_iterator begin() const
Эта функция-член возвращает итератор по набору карт свойств, удерживаемых объектом dynamic_properties.
iterator end()
const_iterator end() const
Эта функция-член возвращает терминальный итератор по набору динамических карт свойств, удерживаемых объектом dynamic_properties. Он используется для прекращения трансверсалов по набору динамических карт недвижимости
iterator lower_bound(const std::string& name)
Эта функция-член возвращает итератор, который указывает на первую карту свойств, dynamic_properties ключ имя. Имейте в виду, что множественные карты свойств могут иметь один и тот же ключ dynamic_properties, при условии, что их карты свойств различаются.
Инвариант: Диапазон [нижний_связь(имя), конец()) содержит каждую карту свойств, которая имеет название для своего ключа dynamic_properties.
При переходе к dynamic_properties конструктора эта функция позволяет объекту dynamic_properties игнорировать попытки поставить значения на неизвестные ключи без сигнализации ошибки.
Эта функция добавляет пару ключевых значений к карте свойств с соответствующим именем и типом ключа. Если не найдена соответствующая карта свойств, поведение зависит от наличия генератора карты недвижимости. Если генератор карты недвижимости был поставлен, когда был построен объект dynamic_properties, то эта функция используется для создания новой карты свойств. Если генератор не может генерировать карту собственности (возвратит нуль shared_ptr), то функция put возвращает false. Если, с другой стороны, dynamic_properties объект не имеет генератора карты собственности (то есть он был построен по умолчанию), то property_not_found выбрасывается. Если карта собственности кандидата найдена, но она не поддерживает put, dynamic_const_put_error брошен.
Эта функция получает значение от карты свойств, имя которой дано и ключевой тип которого совпадает. Если Value является std::string, то тип стоимости карты должен быть либо std::string, либо модель Выход Стамируемый. В последнем случае функция get преобразует значение в строку. Если не найдена соответствующая карта свойств, dynamic_get_failure выбрасывается.
class dynamic_property_map
Этот класс описывает интерфейс, используемый dynamic_properties для взаимодействия с картами свойств пользователя полиморфно.
boost::any get(const any& key)
Учитывая представление ключа, возвращайте значение, связанное с этим ключом.
Требование: 1) Объект, пройденный, поскольку ключ должен быть конвертируемым в значение ключевого типа карты. Детали этого преобразования не указаны. 2) Для того чтобы это выражение было действительным, ключ должен быть связан с некоторым значением, иначе результат не определяется.
std::string get_string(const any& key)
Учитывая представление ключа, возвращайте строковое представление значения, связанного с этим ключом.
Требования: 1) Объект, пройденный, поскольку ключ должен быть конвертируемым в ключевой тип карты недвижимости. Детали этого преобразования не указаны. 2) Для того чтобы это выражение было действительным, ключ должен быть связан с некоторым значением, иначе результат не определяется. 3) Тип значения карты недвижимости должен моделировать Выход Потокируемый.
void put(const any& key, const any& value)
Учитывая представление ключа и представление значения, ключ и значение связаны в карте недвижимости.
Требования: 1) Объект, пройденный, поскольку ключ должен быть конвертируемым в ключевой тип карты недвижимости. Детали этого преобразования не указаны. 2) Объект, пройденный, поскольку значение должно быть конвертируемым в тип значения карты свойств. Детали этого преобразования не указаны. 3) Карта свойств не должна поддерживать эту функцию члена, в этом случае будет сигнализирована ошибка. Это аналог времени выполнения концепции Readable Property Map.
При определенных обстоятельствах призывы к dynamic_properties функции-члены будут бросать одно из вышеуказанных исключений. Все три конкретных исключения можно зафиксировать с помощью общего dynamic_property_ exception moniker, когда большая точность не нужна. Кроме того, все вышеуказанные исключения вытекают из стандарта std::исключение для еще более обобщенной обработки ошибок. Конкретные обстоятельства, которые приводят к этим исключениям, описаны выше.
Статья Boost Dynamic Property Maps раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.