Как написать собственный предикат для multi_index_containder с композитным ключом? - PullRequest
1 голос
/ 10 июня 2010

Я гуглил и искал в бусте, но не нашел примеров.Может быть, это глупый вопрос ... в любом случае.

Итак, у нас есть известная телефонная книга от человека:

typedef multi_index_container<
  phonebook_entry,
  indexed_by<
    ordered_non_unique<
      composite_key<
        phonebook_entry,
        member<phonebook_entry,std::string,&phonebook_entry::family_name>,
        member<phonebook_entry,std::string,&phonebook_entry::given_name>
      >,
      composite_key_compare<
        std::less<std::string>,   // family names sorted as by default
        std::greater<std::string> // given names reversed
      >
    >,
    ordered_unique<
      member<phonebook_entry,std::string,&phonebook_entry::phone_number>
    >
  >
> phonebook;


phonebook pb;
...
// look for all Whites
std::pair<phonebook::iterator,phonebook::iterator> p=
  pb.equal_range(boost::make_tuple("White"), my_custom_comp());

Как должна выглядеть my_custom_comp ()?Я имею в виду, что для меня ясно, что в качестве аргумента требуется boost::multi_index::composite_key_result<CompositeKey> (из-за ошибок компиляции :)), но что такое CompositeKey в данном конкретном случае?

struct my_custom_comp
{
    bool operator()( ?? boost::multi_index::composite_key_result<CompositeKey> ?? ) const
    {
        return blah_blah_blah;
    }
};

Заранее спасибо.

1 Ответ

2 голосов
/ 10 июня 2010

Это должно выглядеть как composite_key_compare.Для вашего случая (не шаблонная версия):

typedef composite_key<
    phonebook_entry,
    member<phonebook_entry,std::string,&phonebook_entry::family_name>,
    member<phonebook_entry,std::string,&phonebook_entry::given_name>
  > my_comp_type_t;

struct my_custom_comp
{
    bool operator()( 
        const boost::tuple<const char*>& x,
        const boost::multi_index::composite_key_result<my_comp_type_t>& y ) const
    {
        return false; // should return something instead of false
    }
    bool operator()( 
        const boost::multi_index::composite_key_result<my_comp_type_t>& y,
        const boost::tuple<const char*>& x ) const
    {
        return false; // should return something instead of false
    }
};
...