Чтобы избежать ошибки компилятора 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... (и все равно это не работает)