Я полагаю, это немного простой вопрос.
Векторы и списки имеют функции 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);
— должно привести к ошибке компиляции на сайте вызовов, не где-то внутри шаблона!
У кого-нибудь есть идеи?
Комитет по стандартизации C ++ попытался представить концепции для C ++ 0x (теперь C ++ 11), чтобы решить проблемы, которые вы поднимаете здесь. Они были вынуждены отстраниться от них поздно, поэтому нам придется подождать до следующей версии стандарта.
Повышение-х BCCL предлагает портативное временное решение. Я никогда не пользовался библиотекой, поэтому я не могу ручаться за или против нее.
Большинство алгоритмов stl использовали итераторы в качестве уровня абстракции от контейнера.
Например, sort
требуется 2 итератора произвольного доступа для сортировки:
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
Большинство алгоритмов могут быть реализованы с использованием этой идиомы
В зависимости от алгоритма, который вы планируете реализовать, вам нужно будет выбрать между 4 типами стандартных итераторов
Вот это ссылка, которая объясняет, какой тип лучше подходит