boost::intrusive, трабла с поиском элемента
От: Tasheehoo  
Дата: 14.11.15 21:31
Оценка:
Есть такая структура:
struct item: set_base_hook<> {
   const char *name;
   const std::uint16_t code;
};

Согласно доке, для возможности использовать set как map, объявляю контейнер так:
struct item_code_getter {
    using type = std::uint16_t;

    const type& operator()(const item &i) const
    { return i.code; }
};

boost::intrusive::set<
     item
    ,boost::intrusive::key_of_value<item_code_getter>
> map;

Кладу элементы в контейнер, и могу итерироваться по ним.

Далее, пытаюсь найти элемен:
const auto it = map.find(36);

— элемент находится. С этим все правильно.

Но при попытке проделать все то же самое но для 'item::name' — элемент не находится:
struct item_name_getter {
    using type = const char*;

    type operator()(const item &i) const
    { return i.name; }
};

boost::intrusive::set<
     item
    ,boost::intrusive::key_of_value<item_name_getter>
> map;

Тут меня смущает то, что для 'item_code_getter' я возвращаю ссылку на 'code', который является 'std::uint16_t'. Но вот как вернуть ссылку на 'char*' — я не понимаю. Возможно в этом и проблема?
И при всем при этом, код поиска по 'item::name' — успешно компилится.
Отредактировано 14.11.2015 21:33 Tasheehoo . Предыдущая версия .
Re: boost::intrusive, трабла с поиском элемента
От: _Artem_ Россия  
Дата: 15.11.15 05:03
Оценка: +1
Здравствуйте, Tasheehoo, Вы писали:
T>Но при попытке проделать все то же самое но для 'item::name' — элемент не находится:

Конечно, у тебя же при поиске идет сравнение указателей на const char. Поэтому, либо тебе нужен кастомный operator <, либо храни вместо const char * std::string.
Отредактировано 15.11.2015 5:04 _Artem_ . Предыдущая версия .
Re[2]: boost::intrusive, трабла с поиском элемента
От: Tasheehoo  
Дата: 15.11.15 19:32
Оценка:
Здравствуйте, _Artem_, Вы писали:

_A_>Конечно, у тебя же при поиске идет сравнение указателей на const char. Поэтому, либо тебе нужен кастомный operator <, либо храни вместо const char * std::string.

Да, все верно, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.