шаблонная функция-член для повышения мультииндексного контейнера

Таким образом, у меня есть мультииндексный контейнер 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"... Я исправил это..


person ScaryAardvark    schedule 28.01.2010    source источник
comment
Вы можете подумать о том, чтобы найти имя для аргументов шаблона, которое немного сложнее спутать с числовым литералом.   -  person David Rodríguez - dribeas    schedule 28.01.2010
comment
Привет Дэвид, я согласен. Я выбрал только эти аргументы для своего примера.   -  person ScaryAardvark    schedule 28.01.2010


Ответы (1)


Изменить определение класса.

template < typename O, typename KT, KT (O::* KM)() >
class Container 
//...

и используйте KM вместо &KM.

person Alexey Malistov    schedule 28.01.2010
comment
Алексей. Это почти сработало. Теперь я получаю другую ошибку. Я отредактировал свой пост с вашим примером, чтобы показать ошибку. - person ScaryAardvark; 28.01.2010
comment
Алекси.. Я никогда не должен был сомневаться в тебе.. Ошибка компилятора, которую я получил, была связана с тем, что объект, используемый в контейнере, имел неправильную подпись...... - person ScaryAardvark; 28.01.2010