Is there a way to use member functions in the specification of composite_key's in boost multi_index_container's?
#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++; }
The code above represents what I would like to do, but the member<> template does not accept the BOOST_MULTI_INDEX_CONST_MEM_FUN macro the way ordered_non_unique<> does.
Anyone come across this?
Thanks!