Возвращение std :: list через итератор НЕ используя шаблоны - PullRequest
0 голосов
/ 15 июля 2011

ссылаясь на этот ответ , второй кодовый блок.Мой вопрос:

Если я знаю, я буду обрабатывать только std::lists<int> и только <int>.Есть ли способ написать это (второй блок и третий) без использования шаблонов и без передачи списка по ссылке, как это предлагается в комментариях?Не могли бы вы показать это мне?

Я думаю, что имеет смысл избегать использования шаблонов, если реализация охватывает только один единственный правильный тип ???(или мне лень?)

1 Ответ

4 голосов
/ 15 июля 2011

Это мой ответ!

Вы можете передать 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.Как вы можете видеть из кода, избегать шаблонов - это не лень, а просто меньше текста, чтобы написать шаблон именно потому, что вам не нужно упоминать типы.Но если по какой-то причине вы хотите пойти по пути ограничить эту функцию, чтобы работать только со списками, и только с добавлением в конце их, то вы можете пойти дальше.

...