Как извлечь элемент из boost :: multi_index_container - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь получить значение из boost::multi_index_container, используя уникальный числовой индекс идентификатора. Я никогда не использовал boost::multi_index_container раньше, поэтому у меня возникли проблемы с пониманием, как они работают. Похоже, они работают немного как база данных, все, что я хочу сделать, - это извлечь элемент, указав идентификатор. Любая помощь будет принята с благодарностью.

Это тип данных:

typedef boost::multi_index_container<
    // Multi index container holds pointers to the subnets.
    Subnet6Ptr,
    // The following holds all indexes.
    boost::multi_index::indexed_by<
        // First is the random access index allowing for accessing
        // objects just like we'd do with a vector.
        boost::multi_index::random_access<
            boost::multi_index::tag<SubnetRandomAccessIndexTag>
        >,
        // Second index allows for searching using subnet identifier.
        boost::multi_index::ordered_unique<
            boost::multi_index::tag<SubnetSubnetIdIndexTag>,
            boost::multi_index::const_mem_fun<Subnet, SubnetID, &Subnet::getID>
        >,
        // Third index allows for searching using an output from toText function.
        boost::multi_index::ordered_unique<
            boost::multi_index::tag<SubnetPrefixIndexTag>,
            boost::multi_index::const_mem_fun<Subnet, std::string, &Subnet::toText>
        >
    >
> Subnet6Collection;

Объект Subnet6Collection создается, когда dhcpv6-сервер (KEA) загружает свой файл конфигурации. Этот файл содержит необязательное числовое значение идентификатора для каждой подсети, SubnetID в типе данных.

Я хотел бы получить Subnet6Ptr, указав SubnetID.

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Да, с Mutli-index сложно работать.Как я писал в другой ответ , «Boost.Multi-index предлагает чрезвычайно настраиваемый интерфейс за счет предложения чрезвычайно сложного интерфейса».

В основном, когда вы хотите получить доступсодержимое контейнера, вы делаете это через один из его индексов.Поэтому вы начинаете с получения ссылки на индекс, который вы хотите использовать (в вашем случае он имеет тег SubnetSubnetIdIndexTag), а затем рассматриваете этот индекс почти как контейнер.Какой контейнер зависит от типа индекса.Для упорядоченного уникального индекса (как в вашем случае) это было бы примерно как std::map (но с итераторами, указывающими только на значения), или как std::set с прозрачным компаратором, который сравнивает только идентификаторы.

Вот как это выглядит в коде:

Subnet6Collection coll = something();
SubnetID idToLookFor = something2();

auto& indexById = coll.index<SubnetSubnetIdIndexTag>();
auto it = index.find(idToLookFor);
if (it != index.end()) {
  Subnet6Ptr p = *it;
} else {
  // No such ID found
}
0 голосов
/ 03 июля 2019

Спасибо за ответ.

Я попробовал следующее (SubnetID это просто uint32_t, поэтому я использовал 10 для теста):

SubnetID id = 10;
Subnet6Collection coll;

auto& indexById = coll.index<SubnetSubnetIdIndexTag>();
auto it = index.find(id);
if (it != index.end()) {
  Subnet6Ptr p = *it;
} else {
  // No such ID found
}

, но он не компилируется:

Opt18_lease_select.cc: 38: 24: ошибка: недопустимое использование 'struct boost :: multi_index :: multi_index_container, boost :: multi_index :: indexed_by>, boost :: multi_index :: order_unique, boost :: multi_index :: const_mem_fun>,boost :: multi_index :: order_unique, boost :: multi_index :: const_mem_fun, & isc :: dhcp :: Subnet :: toText>>>> :: index '

auto& indexById = coll.index<SubnetSubnetIdIndexTag>();
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Opt18_lease_select.cc: 39: 17: ошибка: перегруженная функция без контекстной информации о типе

 auto it = index.find(id);
                 ^~~~

Opt18_lease_select.cc: 40: 17: ошибка: перегруженная функция без контекстной информации о типе

 if (it != index.end()) {
                 ^~~

Похоже на индекс ()find (), end () не могут быть использованы таким образом, или, может быть, мне просто не хватает какого-то заголовочного файла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...