Ссылка на член члена в шаблоне

Я использую boost::multi_index_container и пытаюсь сослаться на член члена в аргументе шаблона, но неясно, как это сделать:

struct Foo {
    int unique_value;
};

struct Bar {
    Foo foo;
    double non_unique_value;
};

// I want to refer to some_value in a template argument:
multi_index_container<Bar, boost::multi_index::indexed_by<
    ordered_unique< member< Foo, int, &Bar::foo::unique_value > >, // this doesn't work
    ordered_non_unique< member< Bar, double, &Bar::non_unique_value > > // this works
> >

Как я могу сослаться на unique_value в аргументе шаблона? Я понимаю, почему то, что я сделал, не работает: я должен сообщить, что Foo - это тип, который является членом Bar и делает что-то более похожее на Bar::Foo::some_value, но неясно, как я могу это указать.


person Kenny Peng    schedule 26.07.2010    source источник
comment
boost.org/doc/libs/ 1_43_0 / libs / multi_index / doc / tutorial / boost :: multi_index_container позволяет это, и именно так вы указываете элемент, для которого хотите создать индекс.   -  person Kenny Peng    schedule 27.07.2010
comment
спасибо, я посмотрел, он указывает указатель на переменную-член.   -  person Anycorn    schedule 27.07.2010


Ответы (3)


Время от времени всплывают вопросы об этой функции, поскольку это действительно очень логично. Но, к сожалению, это не часть языка.

См. Также эту ветку Запрещен ли указатель на внутренний член структуры?

person AnT    schedule 26.07.2010

Вы можете обойти это с помощью подходящего метода в Bar

struct Bar {
    Foo foo;
    double non_unique_value;
    int get_unique_value() const { return foo.unique_value; }
};

а затем используйте const_mem_fun

ordered_non_unique<  const_mem_fun<Bar,int,&Bar::get_unique_value> >
person Aaron McDaid    schedule 27.07.2010
comment
Да, в итоге я использовал global_fun. - person Kenny Peng; 27.07.2010

Вы можете написать определяемый пользователем экстрактор ключей, который делает работу.

person Joaquín M López Muñoz    schedule 27.07.2010