Функции шаблона с STL Векторы ломаются с новым распределителем

У меня есть тонна функций, которые определены как что-то вроде:

template<typename T>
void myFunction1(vector<T>& vin);

Дело в том, что я ввожу вектор STL и выполняю некоторую работу.

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

template<typename T, typename Alloc>
void myFunction1(vector<T,Alloc>& vin);

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

Означает ли это, что мне нужно переписать КАЖДУЮ функцию с двумя определениями, одно с шаблоном для распределителя, а другое определение без распределителя? Я действительно надеюсь, что это не ответ …

0

Решение

Вполне достаточно иметь один единственный шаблон функции, который соответствует шаблону полного класса. Гипотетически, это будет делать:

template <typename T, typename Alloc>
void myFunction1(std::vector<T, Alloc> & v);

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

Однако на самом деле более плодотворная идиома — сделать весь контейнер шаблоном:

template <typename V>
void myFunction1(V & v)
{
typedef typename V::value_type value_type;
// ...
}
1

Другие решения

Более простым решением может быть реализация ваших функций в терминах итераторов, как это делается в стандартных библиотечных алгоритмах:

template <typename Iterator>
void myFunction1(Iterator1 first, Iterator2 last) { .... }
2

Я думаю, что вы тоже изменили свой шаблон.
Но хорошая новость в том, что вы можете изменить свой шаблон так:

template <typename MyVector>
void myFunction1(MyVector& vin);
0

Вам не нужно предоставлять две перегрузки для каждого шаблона функции. Просто предоставьте двухпараметрический. std::vector имеет два параметра шаблона, поэтому оба будут выведены просто отлично.

0