Объявить функцию, принимающую общий итератор
С учетом этого кода можно изменить dumpStrings()
, чтобы иметь возможность перебирать любой контейнер string
, например say a list<string>
?
#include <vector>
#include <string>
#include <ostream>
#include <iostream>
using namespace std;
void dumpStrings(vector<string>::iterator it, vector<string>::iterator end)
{
while (it != end) {
cout << *it++ << endl;
}
}
int main()
{
vector<string> strVector;
strVector.push_back("Hello");
strVector.push_back("World");
dumpStrings(strVector.begin(), strVector.end());
return 0;
}
Ответы
Ответ 1
да
http://www.boost.org/doc/libs/1_45_0/libs/utility/enable_if.html
http://www.cplusplus.com/reference/std/iterator/iterator_traits/
http://www.boost.org/doc/libs/1_44_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html
template<class I>
typename enable_if<
is_same<typename iterator_traits<I>::value_type, string>
>::type
function(...
Ответ 2
Создать шаблон
template<class iterator_type>
void dumpStrings(iterator_type it, iterator_type end)
{
while (it != end) {
cout << *(it++) << endl;
}
}
Шаблон также удаляет предел типа значения контейнера в строку. Обратите внимание, что вам нужны скобки вокруг него ++.
Ответ 3
Я не думаю, что вам будет так просто, как хотелось бы. В идеале вы могли бы просто сделать что-то вроде
void dumpStrings(AbstractIterator<string> beg, AbstractIterator<string> end) { }
но итераторы STL, похоже, не имеют иерархии наследования, достаточно раздражающе. Таким образом, похоже, что вы застряли в использовании шаблонов функций - как это делается в Библиотека алгоритмов STL.
Извините - мне жаль, что не было лучшего способа, но это нужно будет сделать. Не забудьте объявить полный шаблон функции в файле заголовка!
Ответ 4
Попробуйте это, это будет работать во всех контейнерах:
template<class T>
void disp(T &t)
{
for( auto itr=t.begin();itr!=t.end();itr++)
cout<<*itr<<endl;
}
.cpp
vector<int> v(3,77);
list<string> l(5,"Hello");
disp(l)
disp(v);
Примечание. Не забудьте указать строку ,
И авто доступно в С++ 11