Как получить значение из мультииндекса - PullRequest
2 голосов
/ 08 марта 2011

Я пытаюсь сделать одну мультикарту (4 переменные), используя индекс boost-multi.Могу ли я узнать, как получить значение определенного индекса, например

tmp_Container.get<name>().find("aaa")->firstVariable

РЕДАКТИРОВАТЬ

struct EnumStruct
{
    int microsoftEnum;
    std::string microsoftEnumString;
    int localEnum;
    std::string localEnumString;
}

typedef bmi::multi_index_container<
    EnumStruct,
    bmi::ordered_unique<bmi::tag<localEnum>,bmi::member < 
        EnumStruct,std::string,&EnumStruct::localEnumString > >
    >
> boost_Enum_Container;

boost_Enum_Container enumStructContainer;


int main()
{
    enumStructContainer.insert(EnumStruct(1,"MS_1",11,"LOC11"));
    enumStructContainer.insert(EnumStruct(2,"MS_2",22,"LOC22"));
    enumStructContainer.insert(EnumStruct(3,"MS_3",33,"LOC33"));
    //enumStructContainer.get<0>().find(1);
    //boost_Enum_Container::index<localEnum>::type&
    localEnum_Index=enumStructContainer.get<localEnum>().find(22)->firstVariable;
    boost_Enum_Container::iterator
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 08 марта 2011

Вы используете boost::multi_index::tag неправильно.Чтобы использовать его, вы должны предоставить действительную структуру.

Также вы пытаетесь найти число в строковом индексе.Ниже код должен работать, я не проверял, хотя.

struct LOCALENUM { };
struct LOCALENUMSTR { };

using namespace boost::multi_index;

typedef boost::multi_index_container<
    EnumStruct,
indexed_by<
    ordered_unique<tag<LOCALENUM>,member<EnumStruct,int,&EnumStruct::localEnum > >
    >,
    ordered_unique<tag<LOCALENUMSTR>,member<EnumStruct,std::string,&EnumStruct::localEnumString > >
    >
>
> boost_Enum_Container;


typedef boost_Enum_Container::index<LOCALENUM>::type::iterator EnumIterator;
typedef boost_Enum_Container::index<LOCALENUMSTR>::type::iterator EnumStrIterator;

EnumIterator enumiter = enumStructContainer.get<LOCALENUM>().find(22);
EnumStruct & enum_struct = (*eniter);
// There you go : 
std::cout << enum_struct.microsoftEnumString << "\n";


//Searching for LocalEnumString :
EnumStrIterator enunstriter = enumStructContainer.get<LOCALENUMSTR>().find("LOC22");
EnumStruct & enum_struct = (*enunstriter );
std::cout << enum_struct.microsoftEnumString << "\n";
0 голосов
/ 09 марта 2011

Как уже неоднократно упоминалось в других ваших последних вопросах, указатель индекса ordered_unique имеет тот же интерфейс, что и std::map; так что если вы знаете, как использовать std::map ( подсказка , подсказка ), то это должно быть очень просто:

#include <string>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>

struct EnumStruct
{
    EnumStruct(int const me, std::string const& mes, int const le, std::string const& les)
      : microsoftEnum(me),
        microsoftEnumString(mes),
        localEnum(le),
        localEnumString(les)
    { }

    int microsoftEnum;
    std::string microsoftEnumString;
    int localEnum;
    std::string localEnumString;
};

namespace bmi = boost::multi_index;

struct localEnum_t;

typedef bmi::multi_index_container<
    EnumStruct,
    bmi::indexed_by<
        bmi::ordered_unique<
            bmi::tag<localEnum_t>,
            bmi::member<EnumStruct, int, &EnumStruct::localEnum>
        >
    >
> boost_Enum_Container;

int main()
{
    boost_Enum_Container enumStructContainer;
    enumStructContainer.insert(EnumStruct(1, "MS_1", 11, "LOC11"));
    enumStructContainer.insert(EnumStruct(2, "MS_2", 22, "LOC22"));
    enumStructContainer.insert(EnumStruct(3, "MS_3", 33, "LOC33"));
    boost_Enum_Container::index_iterator<localEnum_t>::type iter = enumStructContainer.get<localEnum_t>().find(22);
    if (iter != enumStructContainer.get<localEnum_t>().end())
        std::cout << "found, localEnumString == " << iter->localEnumString << std::endl;
    else
        std::cout << "didn't find anything" << std::endl;
}
0 голосов
/ 08 марта 2011

Вам нужна функция project. См. http://www.boost.org/doc/libs/1_39_0/libs/multi_index/doc/tutorial/basics.html#projection и http://www.boost.org/doc/libs/1_46_0/libs/multi_index/doc/reference/multi_index_container.html#projection. Таким образом: tmp_Container.project<0>(tmp_Container.get<name>.find("aaa")).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...