Таким образом, у меня есть многоиндексный контейнер boost.
using namespace boost::multi_index;
template < typename O >
class Container
{
public:
multi_index_container<
O,
indexed_by<
ordered_unique<
const_mem_fun< O, std::string, &O::name >
>
>
> _container;
};
Как видите, в соответствии с этим дизайном каждый объект, который я использую для создания этого контейнера, должен иметь функцию-член, возвращающую строку с именем "name".
Это явно не идеально. Я попробовал несколько способов передачи "ключа", но я не могу заставить их работать ...
Я попробовал это ..
using namespace boost::multi_index;
template < typename O, typename KT, typename KM >
class Container
{
public:
multi_index_container<
O,
indexed_by<
ordered_unique<
const_mem_fun< O, KT, &KM >
>
>
> _container;
};
int main( int c, char *v[] )
{
Container< Object, std::string, Object::name > container;
}
но без радости ..
компилятор жалуется, что Object :: name не является типом, но я не уверен, как это исправить. И даже если я решу, как предоставить тип для шаблона, мне все равно понадобится конкретный экземпляр «Object :: name», который будет использоваться контейнером.
может быть, я должен передать типы, а затем и функцию-член при создании? но тогда как мне построить контейнер .. Моя голова болит!?!
Алексей, ниже, любезно предложил это решение
using namespace boost::multi_index;
template < typename O, typename KT, KT (O::* KM)() >
class Container
{
public:
multi_index_container<
O,
indexed_by<
ordered_unique<
const_mem_fun< O, KT, KM >
>
>
> _container;
};
int main( int c, char *v[] )
{
Container< Object, std::string, &Object::name > container; // <<---- ERROR HERE
}
Однако это привело к следующей ошибке компилятора.
Template parameter KM requires an expression of type std::string (Object::*)().
в строке, помеченной ..
Хорошо. Оказывается, это была моя ошибка, я передал неправильно подписанный параметр "& Object :: name" ... Я исправил это ..