Это очень интересный момент дизайна. Структура, введенная в std::set theory, позволяет управлять различными ограничениями с помощью очень простого и концептуального подхода. Легко как запоминать, так и учиться. Идея здесь заключается в том, чтобы позволить пользователю непосредственно указать тип сбора каждого ключа. Чтобы реализовать эту функцию, мы должны решить две проблемы:
- Типы индексов ядра
multi_index_container
теперь зависят от типа сбора, используемого для каждого ключа.
- Виды карт теперь меняют свою семантику в соответствии с выбранным типом коллекции.
Повышаю. Бимап в значительной степени полагается на Boost. MPL для реализации всех метапрограмм, необходимых для работы этой структуры. По умолчанию, если пользователь не указывает тип набора, используется тип std::set
.

Ограничения представления набора бимап являются еще одной очень важной особенностью. В общем, Буст. Пользователи Bimap будут основывать тип просмотра на одном из двух типов набора ключей. Однако может быть полезно дать этому набору другие ограничения или просто заказать его по-другому. По умолчанию, Boost. Bimap основывает тип отношений сбора на левом типе сбора, но пользователь может выбрать между:
- left_based
- right_based
- set_of_relation<>
- multiset_of_relation<>
- unordered_set_of_relation<>
- unordered_multiset_of_relation<>
- list_of
- вектор
В первых двух случаях в multi_index_core
есть только два индекса, и по этой причине они являются предпочтительными вариантами. В реализации используется дополнительное метапрограммирование для определения нового индекса при необходимости.
Идея использования тегов вместо идиомы member_at::side
очень привлекательна, поскольку код, который ее использует, более читаем. Единственная цена – это время компиляции. boost/bimap/tagged - это реализация неинвазивной помеченной идиомы. Класс relation
построен таким образом, что даже когда пользователь использует теги, идиома member_at::side
продолжает работать. Это хорошо, так как пользователь может начать пометку еще до завершения кодирования алгоритма, а непомеченный код продолжает работать. Разработка становится немного сложнее, когда включаются пользовательские теги, но есть много удобных метафункций, определенных в tagged
. Идиома, которая помогает держать вещи достаточно простыми.
