Это мой ответ!
Вы можете передать std::back_insert_iterator<std::list<int> >
в функцию с шаблонами или без них.По секрету вы по-прежнему передаете список по ссылке, поскольку сам итератор содержит ссылку или указатель на контейнер.
typedef std::back_insert_iterator<std::list<int> > OutputIterator;
void getInts(OutputIterator out) {
for (int i = 0; i < 10; ++i) {
*(out++) = i;
}
}
Тогда вызывающая сторона делает:
std::list<int> l;
getInts(std::back_inserter(l));
You 'Вы по-прежнему «используете шаблоны» в том смысле, что back_inserter
является шаблоном функции, а back_insert_iterator
является шаблоном класса, но, опять же, так же, как и list
.Таким образом, вы не пишете никаких собственных шаблонов.
Я не согласен с тем, что имеет смысл избегать шаблонов, если вас интересует только один тип - побочный эффект шаблонов C ++ - это вывод типачерез вывод аргументов шаблона, что означает, что вам не нужно выписывать смешные типы, такие как std::back_insert_iterator<std::list<int> >
, даже один раз в typedef.Как вы можете видеть из кода, избегать шаблонов - это не лень, а просто меньше текста, чтобы написать шаблон именно потому, что вам не нужно упоминать типы.Но если по какой-то причине вы хотите пойти по пути ограничить эту функцию, чтобы работать только со списками, и только с добавлением в конце их, то вы можете пойти дальше.