Увеличете присвояването на подредени итератори с множество индекси

Имам boost multi_index_container, съхраняващ куп местоположения със следния индекс

boost::multi_index::indexed_by<
    boost::multi_index::ordered_unique<
            boost::multi_index::tag<Slot>,
            boost::multi_index::identity<SlotData>
        >,  //ordered_unique
    boost::multi_index::ordered_non_unique<
            boost::multi_index::tag<Level>,
            SlotData::ExtractZ
        >,  // ordered_non_unique
...//index by
.//typedef as SlotLocations

В тази дефиниция смятам, че индексът по подразбиране ще бъде от ordered_unique въз основа на Slot. По-късно имам итератор SlotLocations::iterator, който искам да използвам, за да съхраня резултата от търсене, базирано на Level, което е ordered_non_unique:

typedef SlotLocations::index<Level>::iterator MIterator;

std::pair<MIterator, MIterator> range = map.get<Level>().range(..some conds..);

SlotLocations::iterator itr = range.first;    //error

Търсенето в диапазон работи и връща желания резултат, съхранен в range, но този код няма да се компилира с маркирани линии, като дава следната грешка:

error: no match for 'operator='

Защо не мога да присвоя/съхраня итераторите по този начин? И какви са възможните начини за съхраняване на итератора на резултатите от търсенето?


person xmrflipflop    schedule 07.01.2014    source източник


Отговори (2)


Трябва да проектирате итераторите през индекси

Трябва да е като

 SlotLocations::iterator itr = project<Slot>(map, range.first);
person sehe    schedule 07.01.2014
comment
Наздраве, пропуснах това. Защо boost не внедри автоматично „кастинг“ за това? - person xmrflipflop; 08.01.2014
comment
@xmrflipflop Предполагам, че имате предвид имплицитни реализации? Е, от една страна, немаркираните индекси може да имат идентични типове (това е разрешимо с повече TMP). По-важното обаче е, че неявните преобразувания са склонни да се разпадат в по-сложни среди или да водят до трудни за диагностициране изненади. - person sehe; 09.01.2014

Що се отнася до втория ви въпрос защо проекцията не се извършва автоматично чрез имплицитни преобразувания: всъщност причината не е предложената от @sehe (всички индекси са различни, дори ако не са маркирани, и техните итератори са гарантирано различни типове), но това: проекцията се извършва чрез израз като

it1 =  c.project<X>(it0); // X is either a tag or an index number

което изисква потребителят да предостави контейнера, към който принадлежат и двата итератора: тоест не можете (по принцип) да конвертирате от it0 в it1 само с информацията, съхранявана от it0.

person Joaquín M López Muñoz    schedule 09.01.2014