boost :: multi_index определяемый пользователем экстрактор ключей и составной ключ - PullRequest
1 голос
/ 17 декабря 2010

Чтобы избежать ошибки компилятора msvc2010, я использую определяемый пользователем ключевой экстрактор в составном ключе так:

enum NodeType
{
     TypeOne = 0,
     TypeTwo
};

struct TypeExtractor
{
 typedef NodeType result_type;

 const result_type& operator()(const boost::shared_ptr<Node>& p) const
 {
  return p->getNodeType();
 }        
};

struct byValueAndType{};

typedef boost::multi_index_container<
 boost::shared_ptr<Node>,
 boost::multi_index::indexed_by<
  boost::multi_index::random_access<>,
  boost::multi_index::ordered_non_unique<
   boost::multi_index::tag<byValueAndType>,
   boost::multi_index::composite_key<
    Node,
    boost::multi_index::const_mem_fun<Node, const std::string&, &Node::getValue>,
    TypeExtractor
   >
  >
 >
> NodeList;

typedef NodeList::nth_index<1>::type NodeListByValueAndType;

Кажется, это хорошо компилируется (и компилятор vc больше не падает,)но у меня есть некоторые проблемы, когда я пытаюсь вызвать equal_range:

std::pair<Node::NodeListByValueAndType::const_iterator, Node::NodeListByValueAndType::const_iterator> range;

range = _listNode.get<byValueAndType>().equal_range(boost::make_tuple("MyVal", Node::TypeOne));

в моей более старой реализации, что было нормально, так как мой составной_ключ был «сделан» из двух const_mem_fun.Теперь последний аргумент композитного_ключа - это пользовательский экстрактор ключей, и я не знаю, чем заменить 'Node :: TypeOne'.(в моем вызове equal_range)

компилятор говорит, что он ожидает тип const boost::shared_ptr<Node>&, но я на самом деле не хочу создавать общий указатель на случайный узел хорошего типа только для equal_range... (и все равно это не работает)

1 Ответ

2 голосов
/ 17 декабря 2010

Используйте следующий составной ключевой экстрактор:

boost::multi_index::composite_key<
    boost::shared_ptr<Node>,
    boost::multi_index::const_mem_fun<Node, const std::string&, &Node::getValue>,
    TypeExtractor
>
...