Как написать функцию, принимающую std :: vector или std :: list?

Я полагаю, это немного простой вопрос.

Векторы и списки имеют функции push и pop, и, что более важно, могут быть перебраны:

for ( auto value : items )
...

Однако std :: vector и std :: list, похоже, не разделяют базовый класс. Поэтому возникает вопрос: как мне написать функцию, которая будет принимать одну из них (или, на самом деле, все остальное, что соответствует реализации)?

std::list<int> a;
std::vector<int> b;
DoSomething(a);
DoSomething(b);

Я хотел бы сделать это без перегрузки. Если используются шаблоны, они не должны вызывать безумные сообщения об ошибках. Например, следующий код —

int a;
DoSomething(a);

— должно привести к ошибке компиляции на сайте вызовов, не где-то внутри шаблона!

У кого-нибудь есть идеи?

4

Решение

Комитет по стандартизации C ++ попытался представить концепции для C ++ 0x (теперь C ++ 11), чтобы решить проблемы, которые вы поднимаете здесь. Они были вынуждены отстраниться от них поздно, поэтому нам придется подождать до следующей версии стандарта.

Повышение-х BCCL предлагает портативное временное решение. Я никогда не пользовался библиотекой, поэтому я не могу ручаться за или против нее.

1

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

Большинство алгоритмов stl использовали итераторы в качестве уровня абстракции от контейнера.

Например, sort требуется 2 итератора произвольного доступа для сортировки:

template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);

Большинство алгоритмов могут быть реализованы с использованием этой идиомы

В зависимости от алгоритма, который вы планируете реализовать, вам нужно будет выбрать между 4 типами стандартных итераторов

Вот это ссылка, которая объясняет, какой тип лучше подходит

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector