шаблонная функция-член для увеличения многоиндексного контейнера - PullRequest
2 голосов
/ 28 января 2010

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

1 Ответ

2 голосов
/ 28 января 2010

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

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

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

...