有没有办法在boost multi_index_container中的composite_key规范中使用成员函数?
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/composite_key.hpp>
#include <boost/multi_index/member.hpp>
#include <iostream>
#include <string>
using namespace boost::multi_index;
using namespace std;
class Name {
public:
Name(const string &first, const string &middle, const string &last) : m_first(first) , m_middle(middle) , m_last(last) {}
friend std::ostream& operator << (ostream& os,const Name& n) {
os << n.m_first << " " << n.m_middle << " " << n.m_last << endl;
return os;
}
const string &first() const { return m_first; }
const string &middle() const { return m_middle; }
const string &last() const { return m_last; }
private:
string m_first, m_middle, m_last;
};
struct first {};
struct middle {};
struct last {};
struct last_first {};
typedef multi_index_container <
Name,
indexed_by<
ordered_non_unique<tag<first>, BOOST_MULTI_INDEX_CONST_MEM_FUN( Name, const string &, first)
>,
ordered_non_unique<tag<middle>, BOOST_MULTI_INDEX_CONST_MEM_FUN(Name, const string &, middle)
>,
ordered_non_unique<tag<last>, BOOST_MULTI_INDEX_CONST_MEM_FUN(Name, const string &, last)
>,
ordered_non_unique<
composite_key<
Name,
member<tag<last>, BOOST_MULTI_INDEX_CONST_MEM_FUN(Name, const string &, last)>,
member<tag<first>, BOOST_MULTI_INDEX_CONST_MEM_FUN( Name, const string &, first)>
>
>
>
> Name_set;
typedef Name_set::index<first>::type Name_set_by_first;
typedef Name_set::index<middle>::type Name_set_by_middle;
typedef Name_set::index<last>::type Name_set_by_last;
void main() {
Name_set names;
names.insert(Name("robert", "shawn", "mitchell"));
names.insert(Name("ravi", "john", "spaceman"));
names.insert(Name("david", "abel", "mccoy"));
names.insert(Name("steven", "xavier", "anser"));
names.insert(Name("kris", "nomiddlename", "spigha"));
names.insert(Name("jina", "wilson", "fabrice"));
names.insert(Name("zebbo", "aniston", "michaels"));
names.insert(Name("antonio", "magician", "esfandiari"));
names.insert(Name("nora", "iris", "mitchell"));
cout << "SORTED BY FIRST NAME" << endl;
for (Name_set_by_first::iterator itf = names.get<first>().begin(); itf != names.get<first>().end(); ++itf)
cout << *itf;
cout << "SORTED BY MIDDLE NAME" << endl;
for (Name_set_by_middle::iterator itm = names.get<middle>().begin(); itm != names.get<middle>().end(); ++itm)
cout << *itm;
cout << "SORTED BY LAST NAME" << endl;
for (Name_set_by_last::iterator itl = names.get<last>().begin(); itl != names.get<last>().end(); ++itl)
cout << *itl;
Name_set_by_last::iterator mitchells = names.get<last>().find("mitchell");
while (mitchells->last() == "mitchell")
cout << *mitchells++;
}
上面的代码代表了我想要做的事情,但是成员&lt;&gt;模板不接受BOOST_MULTI_INDEX_CONST_MEM_FUN宏的方式ordered_non_unique&lt;&gt;确实
有人碰到过这个吗?
谢谢!
答案 0 :(得分:3)
看起来你正试图在复合案例中标记关键提取器,但我认为你只能标记索引。我想你想要的是替换
ordered_non_unique<
composite_key<
Name,
member<tag<last>, BOOST_MULTI_INDEX_CONST_MEM_FUN(Name, const string &, last)>,
member<tag<first>, BOOST_MULTI_INDEX_CONST_MEM_FUN( Name, const string &, first)>
>
>
与
ordered_non_unique< tag<somenewtagtype>
composite_key<
Name,
BOOST_MULTI_INDEX_CONST_MEM_FUN(Name, const string &, last),
BOOST_MULTI_INDEX_CONST_MEM_FUN(Name, const string &, first)
>
>