четверг, 9 октября 2008 г.

multi_index + shared_ptr

В различных контейнерах бывает удобно хранить не сами объекты, а указатели на них. Тут multi_index позволяет использовать shared_ptr с объектом почти так же как будто там хранится сам объект, включая индексирование по полям этого объекта. Объявление такого контейнера будет выглядеть примерно так:
// структура с кучей нужных полей
struct callback_t {
long system_id;
long server_id;
long callback_id;
// далее что-то ещё есть возможно
};

// определяем тип контейнера
typedef multi_index_container<
shared_ptr<callback_t>, // <<<<< хранится не объект, а указатель на него!
indexed_by<
ordered_unique<
composite_key< // <<<<< индексы объявляются, как если бы мы работали без обертки
callback_t,
member<callback_t, long, &callback_t::system_id>,
member<callback_t, long, &callback_t::server_id>
>
>
>
> callbacks_t;

А использование ничуть не сложнее, чем обычно:
void main() {
callbacks_t lot_of_callbacks;

callback_t* p = new callback_t; // тут конструктор обычно принимает параметры, но упрощено для примера

lot_of_callbacks.insert( shared_ptr<callback_t>( p ) );
// в lot_of_callbacks хранится не сам объект, а указатель на него

// но поиск работает как обычно
callbacks_t::const_iterator cb_iterator = lot_of_callbacks.find( boost::make_tuple( 1, 1 ) );
}

Комментировать в ВКонтакте