Рассматривается ряд новых функций для включения в будущие выпуски Boost. MultiIndex. Некоторые из них зависят от возможности расширения библиотеки, что является руководящим принципом, определяющим текущий внутренний дизайн библиотеки.
Уведомление индексовмогут быть реализованы как декораторы над уже существующими типами индексов, с добавленной функциональностью, что внутренние события индекса (вставка, стирание, изменение элементов) сигнализируются внешнему объекту, например, с помощьюBoost. сигналыБиблиотека. Эта функциональность может иметь приложения для:
[править]
, , , , , , , , , , , , , , , .
, , , , , , , , , , , , , , , , , , , .
Логинг,
взаимодействие с приложениями на основе GUI,
Синхронизация между отдельными структурами данных.
[ORIG_END] -->
Ниже приводится схема возможной реализации уведомительных индексов:
structinsert_log{voidoperator()(intx){std::clog<<"insert: "<<x<<std::endl;}};intmain(){typedefmulti_index_container<int,indexed_by<notifying<ordered_unique<identity<int>>>,// notifying indexordered_non_unique<identity<int>>>>indexed_t;indexed_tt;// on_insert is the signal associated to insertionst.on_insert.connect(insert_log());t.insert(0);t.insert(1);return0;}// output:
// insert: 0
// insert: 1
Описанная выше функциональность уведомительных индексов использует мощный шаблон дизайна, основанный наиндексных адаптерах, декораторах над уже существующими индексами, которые добавляют некоторую функциональность или каким-то образом изменяют семантику базового индекса. Эта схема может быть использована для реализацииограничений, адаптеров, которые ограничивают элементы, принятые индексом в соответствии с некоторыми предикатами валидации. Ниже приведено возможное понимание того, как могут выглядеть ограничения синтаксиса:
Механизмы, с помощью которых увеличивается. MultiIndex организует операции индексов, удерживаемых<multi_index_container>, достаточно простыми, чтобы сделать их достойными документирования, чтобы (смелый) пользователь мог писать реализации для своих собственных индексов.
<multi_index_container>достаточно богат, чтобы обеспечить основу для реализациипроиндексированных карт, то есть карт, на которые можно посмотреть несколько разных ключей. Мотивацией наличия такого контейнера является, главным образом, эстетическое удобство, поскольку он не предоставляет никаких дополнительных возможностей для подобных конструкций, основанных непосредственно на<multi_index_container>.
Основная проблема написания проиндексированной карты заключается в разработке разумного интерфейса, который максимально похож на<std::map>. По-видимому, существуют фундаментальные трудности в расширении синтаксиса 22 на несколько ключей. Например, рассмотрим ситуацию:
indexed_map<int,string,double>m;// keys are int and string, double is the mapped to value...cout<<m[0]<<endl;// OKcout<<m["zero"]<<endl;// OKm[1]=1.0;// !!
В последнем предложении примера пользователь не имеет возможности обеспечить отображение ключа<string>с тем же значением, что и<m[1]>. Этим и подобным проблемам необходимо посвятить тщательное изучение при проектировании интерфейса потенциальной проиндексированной карты.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.