как изменить элементы только для чтения мультииндекса boost?

Я только что заметил, что не могу вносить изменения в элементы мультииндексного контейнера boost. Это правда? (на основе следующего упрощенного кода) посмотрите на функцию «обновить»:

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index/member.hpp>
namespace sim_mob
{
enum TrafficColor
{
    Red =1,             ///< Stop, do not go beyond the stop line.
    Amber = 2,          ///< Slow-down, prepare to stop before the stop line.
    Green = 3,          ///< Proceed either in the forward, left, or right direction.
    FlashingRed = 4,    ///future use
    FlashingAmber = 5,  ///future use
    FlashingGreen = 6   ///future use
};
//Forward declarations
class Link
{
public:
    int aa;
};

//////////////some bundling ///////////////////
using namespace ::boost;
using namespace ::boost::multi_index;

typedef struct
{
    sim_mob::Link *LinkTo;
    sim_mob::Link *LinkFrom;
//  ColorSequence colorSequence;
    TrafficColor currColor;
} linkToLink;


typedef multi_index_container<
    linkToLink,
    indexed_by<                                                                    // index
        random_access<>,//0
        ordered_non_unique< member<linkToLink,sim_mob::Link *, &linkToLink::LinkTo> >,  // 1
        ordered_non_unique< member<linkToLink,sim_mob::Link *, &linkToLink::LinkFrom> >  // 2
    >
> links_map;
class Phase
{
public:
    typedef links_map::nth_index_iterator<1>::type LinkTo_Iterator;
    Phase(double CycleLenght,std::size_t start, std::size_t percent): cycleLength(CycleLenght),startPecentage(start),percentage(percent){
    };

    void update(double lapse)
    {
        links_map_[0].currColor = Red;
    }

    std::string name;
private:
    sim_mob::links_map links_map_;

};
}//namespace

int main()
{
    sim_mob::Phase F(100,70,30);
}

Нет необходимости проходить всю программу. просто обратите внимание, что в методе обновления я получаю эту ошибку: multiIndex$ c++ exp2.cpp exp2.cpp: в функции-члене 'void sim_mob::Phase::update(double)': exp2.cpp:69:29: error : назначение члена 'sim_mob::linkToLink::currColor' в объекте только для чтения

Я только что прочитал руководство по ускорению. что итераторы предоставляют только постоянный доступ. Как я могу обойти эту проблему? Спасибо за помощь


person rahman    schedule 09.05.2012    source источник


Ответы (1)


Три разных способа изменения элементов в мультииндексном контейнере. Вы можете использовать links_map_.replace(iterator, new_value) для замены существующего элемента новым. Вы можете использовать links_map_.modify(iterator, unaryFunctionObject) для изменения элемента с помощью объекта-модификатора. И, наконец, если переменная-член не является частью какого-либо индекса, вы можете объявить ее как mutable и изменить напрямую. В вашем примере последний должен работать нормально.

Для двух других способов взгляните на спецификацию функций-членов replace и modify в Документация по Boost.MultiIndex.

Изменить. В вашем конкретном случае подход с mutable может выглядеть следующим образом:

struct linkToLink
{
    sim_mob::Link* LinkTo;
    sim_mob::Link* LinkFrom;
    // simplify write operations to this variable if used in a multi-index
    // container - bypassing the const-ness. This is possible, because the
    // variable is not part of any index.
    mutable TrafficColor currColor;
};
person nosid    schedule 09.05.2012
comment
Спасибо за ответ. Было бы более информативно и полезно (особенно для меня), если бы вы могли изменить мой пример кода, чтобы показать, где нам нужно коснуться и как. изменяемого решения было бы достаточно. спасибо и привет - person rahman; 10.05.2012