boost::multi_index как что то изменить через iterator
От: Аноним  
Дата: 29.10.06 21:48
Оценка:
Код:
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 через итератор?
Re: boost::multi_index как что то изменить через iterator
От: MaximE Великобритания  
Дата: 30.10.06 12:00
Оценка:
Аноним 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
Re[2]: boost::multi_index как что то изменить через iterator
От: nen777w  
Дата: 30.10.06 13:46
Оценка:
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.