Я создал универсальный контейнер, расширяющий возможности вектора ... Добавлена новая функциональность для общих функций.
Однако у меня есть одна проблема: удаление дублирующихся уникальных элементов.Он состоит из нескольких этапов: сортировка, создание элементов уникальными, стирание ... Новая функциональность заключается в перенумерации объектов по первичному идентификатору и повторном вычислении некоторых хэшей.Так что это нельзя сделать вне класса List ...
Представим себе следующий пример универсального контейнера (упрощенно):
template <typename Item>
class List
{
protected:
typename TList <Item>::Type items;
...
};
Сравнения были реализованы с использованием функторов ...
template <typename Item>
class isEqual
{
public:
bool operator() ( const Item &i1, const Item &i2 ) const
{
...
}
};
Мы создаем новый список и удаляем дублирующиеся элементы:
List <Object> list;
list.rem_duplic(items.begin(), items.end(), isEqual <Object>);
Как реализовать функцию rem_duplicit, имеющую параметр шаблона ... Если List представляет класс шаблона, то параметр шаблонафунктор должен быть указан при объявлении списка:
List <Object, Comparator <Type> > list;
И это может быть ограничительным: дубликаты могут быть удалены только по одному критерию, функтор не может быть установлен при удалении дублирующих элементов ... Эта конструкция недопустима:
template <typename Item>
class List
{
protected:
typename TList <Item>::Type items;
public:
template <typename Functor>
void rem_duplic(typename TList <Item>::Type ::iterator begin, typename TList <Item>::Type ::iterator end, Functor <Item>) ();
...
};
template <typename Item> template <typename Functor> //Illegal
void List<Item>::rem_duplic(typename TList <Item>::Type ::iterator begin, typename TList <Item>::Type ::iterator end, Functor <Item>)
{
}
Как я могу разумно реализовать такую функцию, то есть что я могу сделать с шаблонным параметром
Functor <Item> ?
Внутренняя функциональность между {} мне понятна ...