Не могу понять multi_index

class ObjectStorage
{
    private:
        std::string objName;
        int zIndex;

        // Reference for the Object interface
        boost::shared_ptr<Object> mCppObject;

        // Reference for the Python interface
        boost::python::object mPythonObject;

    public:
        ObjectStorage(const std::string &name, int zIndex_, boost::shared_ptr<Object> cpp, boost::python::object python)
            : objName(name), zIndex(zIndex_),
              mCppObject(cpp), mPythonObject(python) {}

        std::string getName() const { return objName; };
        int getZIndex() const { return zIndex; }

        boost::shared_ptr<Object> getCppObject() const { return mCppObject; }
        boost::python::object getPythonObject() const { return mPythonObject; }
};

// Tagging for multi_index container
struct tag_zindex {};
struct tag_name {};
struct tag_cpp {};
struct tag_py {};

typedef boost::multi_index_container<ObjectStorage,
            bmi::indexed_by<
                // ZIndex
                bmi::ordered_non_unique<
                    bmi::tag<tag_zindex>,
                    bmi::const_mem_fun<ObjectStorage, int, &ObjectStorage::getZIndex>
                >,

                // Name
                bmi::ordered_unique<
                    bmi::tag<tag_name>,
                    bmi::const_mem_fun<ObjectStorage, std::string, &ObjectStorage::getName>
                >,

                // CPP reference
                bmi::ordered_non_unique<
                    bmi::tag<tag_cpp>,
                    bmi::const_mem_fun<ObjectStorage, boost::shared_ptr<Object>, &ObjectStorage::getCppObject>
                >,

                // Python reference
                bmi::ordered_unique<
                    bmi::tag<tag_py>,
                    bmi::const_mem_fun<ObjectStorage, boost::python::object, &ObjectStorage::getPythonObject>
                >
            >
        > ObjectWrapperSet;

Если первый индекс в multi_index правильный: объекты сортировки внутри контейнера ссылаются на значение ZIndex, я не уверен в другом. Мне нужна такая функциональность: упорядочить по ZIndex, но вернуть getCppObject при итерации. Можно ли задать не только порядок, но и результат при доступе?

Кроме того, например, tag_py я хочу перебрать все getPythonObject, а не ObjectStorage. Это действительно возможно с multi_index?


person Max Frai    schedule 10.04.2011    source источник


Ответы (1)


В вашем случае multi_index_container содержит экземпляры объектов ObjectStorage. Таким образом, вы можете перебирать его в любом порядке и вызывать любую функцию класса ObjectStorage.

Например, для итерации с использованием тега tag_py:

ObjectWrapperSet ow_set;

ObjectWrapperSet::index_const_iterator<tag_py>::type it = ow_set.get<tag_py>().begin();
for ( ; it != ow_set.get<tag_py>().end(); ++it ) {
  const ObjectStorage& os = *it; // note `it` is the iterator for ObjectStorage
  // now you can do
  boost::python::object po = os.getPythonObject();
  // or
  boost::python::object po = it->getPythonObject();
}

Использование тега tag_zindex:

ObjectWrapperSet::index_const_iterator<tag_zindex>::type it = ow_set.get<tag_zindex>().begin();
for ( ; it != ow_set.get<tag_zindex>().end(); ++it ) {
  boost::shared_ptr<Object> cpp_obj = it->getCppObject();
  // do something
}
person Kirill V. Lyadvinsky    schedule 10.04.2011
comment
Слушайте, я о другом: можно ли перебирать какие-то общие данные? Я не хочу звонить getPythonObject() (в вашем примере). Предоставляет ли multi_index такую ​​функциональность? Я хочу перебрать какой-нибудь просмотрщик (тип индекса) и получить не ObjectStorage, а boost::python::object в вашем примере. Это возможно? - person Max Frai; 10.04.2011
comment
multi_index не может этого сделать, но вы можете использовать boost::iterator_adaptor для этого. - person Kirill V. Lyadvinsky; 10.04.2011
comment
@kirill-v-lyadvinsky Спасибо за информацию. Пожалуйста, не могли бы вы дать мне небольшой фрагмент кода, который показывает использование адаптера? Я буду очень рад увидеть это. - person Max Frai; 10.04.2011
comment
Здесь вы можете найти пример учебника. - person Kirill V. Lyadvinsky; 10.04.2011