Таким образом, у меня есть мультииндексный контейнер 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;
};
Как видите, в этом дизайне каждый объект, который я использую для создания этого контейнера, должен иметь функцию-член, возвращающую строку с именем «имя».
Это явно не идеально. Я попробовал пару способов передачи «ключа», но я не могу заставить ни один из них работать.
Я пробовал это..
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», который будет использоваться контейнером.
может быть, мне нужно передать типы, а затем и функцию-член при построении? но тогда как мне сконструировать контейнер.. Голова болит!?!
Alexy, ниже, любезно предложил это решение
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::*)().
на отмеченной линии..
Ok. Оказывается, это была моя вина, когда я передал неправильно подписанный параметр "&Object::name"... Я исправил это..