Код:
struct Event
{
/*event id*/
unsigned int m_nID;
/*event priority*/
EEventPriority m_ePrior;
/*type of events*/
EEventTypes m_evTypes;
/*busy flag*/
bool m_bBusy;
/*startup event time*/
time_t m_startup_time;
/*expired event time*/
time_t m_expired_time;
};
//------------------------------------------------------------------------------
struct nID{};
struct ePrior{};
typedef boost::multi_index::multi_index_container<
Event,
boost::multi_index::indexed_by
<
boost::multi_index::ordered_unique
<
boost::multi_index::tag<nID>, BOOST_MULTI_INDEX_MEMBER(Event, unsigned int, m_nID)
>,
boost::multi_index::ordered_non_unique
<
boost::multi_index::tag<ePrior>, BOOST_MULTI_INDEX_MEMBER(Event, EEventPriority, m_ePrior)
>
>
> eventsPool;
typedef eventsPool::index<nID>::type nID_sub_arr;
typedef eventsPool::index<ePrior>::type ePrior_sub_arr;
ePrior_sub_arr::iterator itr = m_eventsPool.get<ePrior>().begin();
(*itr).m_bBusy = true; //error C3892: 'itr' : you cannot assign to a variable that is const
Как изменить что то в multi_index через итератор?
Аноним wrote:
> struct Event
> {
> /*event id*/
> unsigned int m_nID;
>
> /*event priority*/
> EEventPriority m_ePrior;
>
> /*type of events*/
> EEventTypes m_evTypes;
>
> /*busy flag*/
> bool m_bBusy;
>
> /*startup event time*/
> time_t m_startup_time;
>
> /*expired event time*/
> time_t m_expired_time;
> };
>
> //------------------------------------------------------------------------------
> struct nID{};
> struct ePrior{};
>
> typedef boost::multi_index::multi_index_container<
> Event,
> boost::multi_index::indexed_by
> <
> boost::multi_index::ordered_unique
> <
> boost::multi_index::tag<nID>, BOOST_MULTI_INDEX_MEMBER(Event, unsigned int, m_nID)
> >,
> boost::multi_index::ordered_non_unique
> <
> boost::multi_index::tag<ePrior>, BOOST_MULTI_INDEX_MEMBER(Event, EEventPriority, m_ePrior)
> >
> >
>> eventsPool;
>
> typedef eventsPool::index<nID>::type nID_sub_arr;
> typedef eventsPool::index<ePrior>::type ePrior_sub_arr;
>
> ePrior_sub_arr::iterator itr = m_eventsPool.get<ePrior>().begin();
> (*itr).m_bBusy = true; //error C3892: 'itr' : you cannot assign to a variable that is const
Если изменяешь член, который не используется как index или его часть, то достаточно:
const_cast<Event&>(*itr).m_bBusy = true;
В противном случае, см. док-цию multi_index<>::modify().
--
Maxim Yegorushkin
No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk Posted via RSDN NNTP Server 2.0
ME>Если изменяешь член, который не используется как index или его часть, то достаточно:
ME>ME>const_cast<Event&>(*itr).m_bBusy = true;
ME>
Про const_cast я сразу догадался, просто сам себе не поверил что для того что бы сделать изменение нужно вот так извратиться, подумал м.б. я итераторы не те использую.
Тогда какой самысл в const_iterator в том же пространстве?
ME>В противном случае, см. док-цию multi_index<>::modify().
Спасибо гляну. Я так понимаю этот метод введён что бы сохранить упорядоченную структуру.
Кстати есть ли способ задать при объявлении multi_index свой предикат для упорядочивания в индексном представлении?
ME>--
ME>Maxim Yegorushkin
ME>No Microsoft product was used in any way to write or send this text.
ME>If you use a Microsoft product to read it, you're doing so at your own risk