индекс boost::multi_index вызовом функции с параметром(ами)

Я пытаюсь создать контейнер boost::multi_index, который использует функции-члены с параметрами в качестве ключей.

class Data {
public:
   std::string get(const std::string & _attr) { return _internals_fetch_data(_attr); }

/*
   assume some implementation for storing data in some structure(s)
*/
};

Предположим, у меня есть прямоугольный список этих элементов данных, по которым я хочу указать несколько индексов. прямоугольный означает, что все элементы в списке имеют одинаковые атрибуты через get()

Объявление boost::multi_index выглядит примерно так:

typedef multi_index_container<
  Data,
  indexed_by<
   ordered_unique<
    BOOST_MULTI_INDEX_CONST_MEM_FUN(Data,String,get)
   >
  >
> my_container;

За исключением того, что BOOST_MULTI_INDEX_CONST_MEM_FUNCT() не имеет этих функций. Составные ключи по-прежнему работают с переменными-членами.

Как мне обойти это? Не похоже, что я могу дать order_unique‹> boost::function1

РЕДАКТИРОВАТЬ:

После некоторых размышлений вот суть того, что я пытаюсь сделать.

boost::multi_index определяет функции индексации во время компиляции. Как обойти эти функции и использовать индексы, определяемые во время выполнения?


person George Godik    schedule 02.09.2009    source источник


Ответы (1)


Что вы предполагаете передать в качестве аргумента функции? Что такое const std::string & _attr?

В любом случае, BOOST_MULTI_INDEX_CONST_MEM_FUN — это просто макрос для функтора const_mem_fun. Вы можете написать свой собственный функтор const_mem_fun1. Но я понятия не имею, как ты собираешься его использовать. Реализация const_mem_fun получает объект по ссылке (или оболочке, например shared_ptr), а затем вызывает функцию-член без аргументов.

boost::multi_index::indexed_by ожидает тип, а не объект, как и ordered_unique ожидает тип. Вот почему вы не можете написать const_mem_fun1<Data, std::string, &Data::get>("string"). Почему нельзя использовать функцию get без параметров и создать специальное строковое поле в структуре Data?

struct Data {
  std::string _attr;
public:
  std::string get() const { return _internals_fetch_data(_attr); }
};
person Kirill V. Lyadvinsky    schedule 02.09.2009
comment
Это проблема. Не похоже, что здесь можно использовать const_mem_fun1. - person George Godik; 02.09.2009
comment
Как вы предполагаете передать аргумент? Что-то вроде ordered_unique< const_mem_fun1<Data, std::string, &Data::get>( "string" ) > ? - person Kirill V. Lyadvinsky; 02.09.2009
comment
Возможно (строка) может быть структурой/оболочкой в ​​качестве другого параметра. - person George Godik; 02.09.2009