LINUX.ORG.RU

template<class Key, class Cmp = less<Key_parent> class multiset как?


0

0

stl-овский template<class Key, class Cmp = less<Key>> не подходит, нужно что-то вроде:

template<class Key, class Cmp = less<Key_parent> class multiset как?

Собственно..

class Key_parent

class B: public Key_parent

class C: public Key_parent


И необходимо, чтобы можно было делать:

multiset<B> set_b;

multiset<C> set_c;

B b; C c;

set_b.lower_bound(c);

set_c.lower_bound(b);

Т.е. нужно, чтобы в качестве ключа множества можно было использовать родитель ключа. Можно с multimap, но это немного не то.. =(

Пока сделал с помощью lower_bound из <algorithm>

Вероятно, то же самое можно сделать и более изящно (специализация шаблона или что-то подобное, но еще очень страшное для меня.. :D )

Может кто подскажет? Спасибо.

anonymous

Ответ на: комментарий от watashiwa_daredeska

>Честно говоря, ничего не понял

Надо, чтобы stl-овский set (равно, как и прочие контейнеры) проглатывал в качестве аргумента для функции сравнения родительский класс элементов данного контейнера.

т.е. что-то очень похожее на

map<BaseClass, SomeClass>

при SomeClass : public BaseClass.

Хочется избавиться от избыточности, т.к. ключ - есть родительский класс для элемента. Зачем мне его два экземпляра то хранить? + не красиво как-то.. =|

Пока сделал через <algorithm>, тут можно указать функцию сравнения, причем, в отличие от шаблона set-а, ее аргументы не обязаны быть того же класса, что и элементы контейнера..

Я думал, может можно такую мелочь докрутить путем наследования шаблона.. =\

anonymous
()
Ответ на: комментарий от watashiwa_daredeska

>В Boost.MultiIndex, вроде, такое было.

Просмотрел по-быстрому, похоже, что что-то подобное есть.. Только ээ.. слишком уж "тяжеловесное" и кардинальное решение.. :D

А вообще, через шаблоны из algorithm достаточно красиво получилось. 8)

Спасибо, Boost.MultiIndex еще завтра, если время будет, поковыряю.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.