Увеличьте доступ к закрытым членам с несколькими индексами

у меня есть структура

struct employee
{
  int         id;
  std::string name;

  employee(int id,const std::string& name):id(id),name(name){}

  bool operator<(const employee& e)const{return id<e.id;}

  getId(){return id;}
  getName(){return name;}
};

Если я сделаю такой мультииндекс из учебника, все будет работать хорошо.

typedef multi_index_container<
  employee,
  indexed_by<
    // sort by employee::operator<
    ordered_unique<identity<employee> >,

    // sort by less<string> on name
    ordered_non_unique<member<employee,std::string,&employee::name> >
  > 
> employee_set;

Но если я сделаю членов структуры сотрудников закрытыми, я потеряю возможность использовать их в качестве ключей для контейнера. Я попытался поместить указатели на функции получения, подобные этой &emploeyy::getName, но это не решило проблему.

Итак, мой вопрос: как использовать частные члены в качестве ключей для мультииндексного контейнера?


person Demaunt    schedule 16.02.2018    source источник
comment
Как вы будете подвергать членов employee чему-то еще, что могло бы его использовать?   -  person lakeweb    schedule 16.02.2018
comment
Я могу добавить функции установки-получения   -  person Demaunt    schedule 16.02.2018


Ответы (1)


Существует множество экстракторов ключей. Найдите предопределенные в документации: http://www.boost.org/doc/libs/1_66_0/libs/multi_index/doc/tutorial/key_extractors

Вместо member<> можно использовать mem_fun<> или const_mem_fun.

Жить на Coliru

#include <string>

class employee {
    int id;
    std::string name;

  public:
    employee(int id, const std::string &name) : id(id), name(name) {}

    bool operator<(const employee &e) const { return id < e.id; }

    int getId() const { return id; }
    std::string getName() const { return name; }
};

#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index_container.hpp>

namespace bmi = boost::multi_index;
typedef bmi::multi_index_container<
    employee,
    bmi::indexed_by<
        bmi::ordered_unique<bmi::identity<employee> >,
        bmi::ordered_non_unique<bmi::const_mem_fun<employee, std::string, &employee::getName> >
    > > employee_set;

int main() {}
person sehe    schedule 16.02.2018