2010-08-13 122 views
2

有沒有在boost multi_index_container的composite_key的規範中使用成員函數的方法?使用MEM_FUN提升multi_index複合鍵

#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++; 

} 

上面的代碼表示我願意做的事情,但是成員<>模板不接受BOOST_MULTI_INDEX_CONST_MEM_FUN宏方式ordered_non_unique <>一樣。

有人遇到過嗎?

謝謝!

回答

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) 
     > 
    > 
+0

嘿感謝的人!棒極了。 – shaz 2010-08-14 16:04:05