Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Boost Dynamic Property Maps

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Boost Dynamic Property Maps

Summary

Динамические интерфейсы карты свойств обеспечивают доступ к коллекции карт недвижимости через динамический интерфейс. Алгоритм может использовать его для манипулирования картами собственности, не зная их ключевых или типов ценностей в компиляционное время. Тип-безопасные коды могут использовать динамические карты свойств для более легкого и полного взаимодействия с языками сценариев и другими текстовыми представлениями данных ключевых значений.

Introduction

Увеличить собственность Библиотека карт определяет статически безопасные интерфейсы, через которые пары ключевых значений могут управляться общими алгоритмами. Как правило, алгоритм, использующий карты собственности, параметризируется на типах используемых карт собственности, и он манипулирует ими с использованием интерфейсов, указанных библиотекой Boost Property Map.

Следующая общая функция иллюстрирует основы карты недвижимости.

template <typename AgeMap, typename GPAMap>
void
manipulate_freds_info(AgeMap ages, GPAMap gpas) {
  typedef typename boost::property_traits<AgeMap>::key_type name_type;
  typedef typename boost::property_traits<AgeMap>::value_type age_type;
  typedef typename boost::property_traits<GPAMap>::value_type gpa_type;
  name_type fred = "Fred";
  age_type old_age = get(ages, fred);
  gpa_type old_gpa = get(gpas, fred);
  std::cout << "Fred's old age: " << old_age << "\n"
            << "Fred's old gpa: " << old_gpa << "\n";
  age_type new_age = 18;
  gpa_type new_gpa = 3.9;
  put(ages, fred, new_age);
  put(gpas, fred, new_gpa);
}

Функция параметризирована на двух типах карт недвижимости, 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 функции, которые можно назвать с использованием значений любого типа, которые отвечают нескольким требованиям. Внутренняя карта динамических свойств преобразует пары ключей и значений для удовлетворения требований базовой карты свойств или сигнализирует о временном исключении, если оно не может.

"Fred's Info" Revisited

Вот как выглядит приведенный выше пример с использованием интерфейса dynamic_properties:

void manipulate_freds_info(boost::dynamic_properties& properties)
{
  using boost::get;
  std::string fred = "Fred";
  int old_age = get<int>("age", properties, fred);
  std::string old_gpa = get("gpa", properties, fred);
  std::cout << "Fred's old age: " << old_age << "\n"
            << "Fred's old gpa: " << old_gpa << "\n";
  std::string new_age = "18";
  double new_gpa = 3.9;
  put("age",properties,fred,new_age);
  put("gpa",properties,fred,new_gpa);
}

Новая функция не является шаблоном, параметризованным на типах карт недвижимости, а вместо этого конкретной функцией, которая занимает объект dynamic_properties. Кроме того, код больше не содержит ссылки на ключевые или типы значений: ключи и значения представлены строками. Тем не менее, функция по-прежнему использует нестрочные типы, где они полезны. Например, старый возраст Фреда представлен с использованием int. get с параметром типа, который определяет его тип возврата. Наконец, функции get и put поставляются по строковому ключу, который отличается в зависимости от объекта беспокойства.

Вот пример того, как вышеупомянутую функцию можно назвать.

int main()
{
  using boost::get;
  // build property maps using associative_property_map
  std::map<std::string, int> name2age;
  std::map<std::string, double> name2gpa;
  boost::associative_property_map< std::map<std::string, int> >
    age_map(name2age);
  boost::associative_property_map< std::map<std::string, double> >
    gpa_map(name2gpa);
  std::string fred("Fred");
  // add key-value information
  name2age.insert(make_pair(fred,17));
  name2gpa.insert(make_pair(fred,2.7));
  // build and populate dynamic interface
  boost::dynamic_properties properties;
  properties.property("age",age_map);
  properties.property("gpa",gpa_map);
  manipulate_freds_info(properties);
  std::cout << "Fred's age: " << get(age_map,fred) << "\n"
            << "Fred's gpa: " << get(gpa_map,fred) << "\n";
}

Код сначала создает две карты свойств с использованием std::map и associative_property_map адаптер. После инициализации карт недвижимости с данными ключевых значений, он создает объект dynamic_properties и добавляет к нему обе карты свойств, заложенные на строках "age" и "gpa& " . Наконец, manipulate_freds_info передается объект dynamic_properties и отображаются результаты его изменений.

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

Reference

class dynamic_properties

Класс dynamic_properties обеспечивает динамический интерфейс для набора карт недвижимости. Чтобы использовать его, необходимо заселить объект этого класса картами свойств с использованием функции property.

Member Functions

dynamic_properties()
dynamic_properties(
  const boost::function<
    boost::shared_ptr<dynamic_property_map> (
      const std::string&, const boost::any&, const boost::any&)
    >& fn)

Объект dynamic_properties может быть построен с функциональным объектом, который при вызове создает новую карту свойств. Библиотека предоставляет объект функции ignore_other_properties, который позволяет объекту dynamic_properties игнорировать любые свойства, которые он не был готов записывать. Если сделана попытка put пары ключевых значений к несуществующему ключу dynamic_properties, то эта функция называется с ключом dynamic_properties и предполагаемым ключом свойств и значением. Если dynamic_properties является по умолчанию структурированным, такой put попытаться бросить property_not_found.

template<typename PropertyMap>
dynamic_properties&
property(const std::string& name, PropertyMap property_map)

Эта функция-член добавляет карту свойств к набору содержащихся карт, используя name в качестве своего ключа.

Требования: PropertyMap должен моделировать Читаемая Карта недвижимости или Читать/Написать Карту недвижимости.

void insert(const std::string& name, boost::shared_ptr<dynamic_property_map> pm)

Эта функция-член непосредственно добавляет к коллекции 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.

Free functions

boost::shared_ptr<boost::dynamic_property_map>
ignore_other_properties(const std::string&,
                        const boost::any&,
                        const boost::any&)

При переходе к dynamic_properties конструктора эта функция позволяет объекту dynamic_properties игнорировать попытки поставить значения на неизвестные ключи без сигнализации ошибки.

template<typename Key, typename Value>
bool put(const std::string& name, dynamic_properties& dp, const Key& key,
         const Value& value)

Эта функция добавляет пару ключевых значений к карте свойств с соответствующим именем и типом ключа. Если не найдена соответствующая карта свойств, поведение зависит от наличия генератора карты недвижимости. Если генератор карты недвижимости был поставлен, когда был построен объект dynamic_properties, то эта функция используется для создания новой карты свойств. Если генератор не может генерировать карту собственности (возвратит нуль shared_ptr), то функция put возвращает false. Если, с другой стороны, dynamic_properties объект не имеет генератора карты собственности (то есть он был построен по умолчанию), то property_not_found выбрасывается. Если карта собственности кандидата найдена, но она не поддерживает put, dynamic_const_put_error брошен.

template<typename Value, typename Key>
Value get(const std::string& name, const dynamic_properties& dp,
          const Key& key)

Эта функция получает значение от карты свойств, имя которой дано и ключевой тип которого совпадает. Если 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.

const std::type_info& key() const

Description.

const std::type_info& value() const

Description.

Exceptions

struct dynamic_property_exception : public std::exception {
  virtual ~dynamic_property_exception() throw() {}
};
struct property_not_found : public std::exception {
  std::string property;
  property_not_found(const std::string& property);
  virtual ~property_not_found() throw();
  const char* what() const throw();
};
struct dynamic_get_failure : public std::exception {
  std::string property;
  dynamic_get_failure(const std::string& property);
  virtual ~dynamic_get_failure() throw();
  const char* what() const throw();
};
struct dynamic_const_put_error  : public std::exception {
  virtual ~dynamic_const_put_error() throw();
  const char* what() const throw();
};

При определенных обстоятельствах призывы к dynamic_properties функции-члены будут бросать одно из вышеуказанных исключений. Все три конкретных исключения можно зафиксировать с помощью общего dynamic_property_ exception moniker, когда большая точность не нужна. Кроме того, все вышеуказанные исключения вытекают из стандарта std::исключение для еще более обобщенной обработки ошибок. Конкретные обстоятельства, которые приводят к этим исключениям, описаны выше.

Статья Boost Dynamic Property Maps раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 12:43:53/0.0064520835876465/0