我有一个结构
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;
但是如果我将employee struct的成员设为私有,那么我就失去了使用em作为容器密钥的能力。我尝试将指针放到像&emploeyy::getName
这样的getter函数中,但它没有解决问题。
所以我的问题是:如何使用私有成员作为多索引容器的键?
答案 0 :(得分:2)
有许多关键提取器可供使用。在文档中找到预定义的文件:http://www.boost.org/doc/libs/1_66_0/libs/multi_index/doc/tutorial/key_extraction.html#predefined_key_extractors
您可以使用member<>
或mem_fun<>
来代替const_mem_fun
。
<强> Live On 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() {}