Шаблонный метод для контейнеров с++
Имеется метод
void SortVector(vector<int>& vec, int topV, bool wozrastanie)
Хочу его сделать шаблонным, чтобы сортировать не только вектор, но и deque. Пишу такой код, но это не работает.
template <typename T>
void SortVector(T<int>& vec, int topV, bool wozrastanie)
Можно ли решить проблему не переписывая один и тот же метод под каждый контейнер?
Ответы (4 шт):
Решение моей проблемы
template <typename T>
void SortVector(T & vec, int topV, bool wozrastanie)
Пример использования
SortVector<vector<int>>(vec, topV, 0);
Ну, если очень хочется менять только контейнер, но при этом оставить тип элементов int - то используйте шаблонный аргумент шаблона:
template<template<class E,class Alloc=std::allocator<E>> typename Container>
void SortVector(Container<int>& vec, int topV, bool wozrastanie)
Можно обратить свое внимание не то, как реализованы стандартные алгоритмы в stl (тот же самый std::sort). В чем особенность stl алгоритмов? - в одинаковых (с оговорками) интерфейсах у итераторов! У std::vector, std::list, std::deque, std::map и тд почти одинаковый интерфейс у итераторов. Как это используется в стандарте? Как мы можем это использовать?
template <typename IterType>
void user_func(IterType first, IterType last) //совершает какие то действия для диапазона [first, last)
{
while (first != last)
{
std::cout << *first;
++first;
}
std::cout << '\n';
}
//проверяем
int main()
{
std::vector<int> v = { 1, 2, 3, 4 };
std::list<double> l = { 3, 2, 1, 3 };
user_func(v.begin(), v.end()); //выведет 1 2 3 4
user_func(v.begin(), v.begin() + v.size() / 2); //выведет 1 2
user_func(l.begin(), l.end()); //выведет 3 2 1 3
}
Если ваша функция должна обработать только стандартные контейнеры, то можно ввести ограничение, чтобы она принимала только объекты шаблонных классов, поскольку все стандартные контейнеры шаблонные. Но и лучше иметь возможность обработать контейнер с любым типом элементов(в случаи сортировки типы элементов должны иметь свойство сравниваться). И так, я предлагаю вариант:
template <typename T, template<typename> class Cont>
void SortVector(Cont<T>& vec, int topV, bool wozrastanie)
{
//...
}
Ну и вам решать для чего второй аргумент функции...