// структура с кучей нужных полей
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 ) );
}