Reputation: 522
Given this code, is it possible to change dumpStrings()
to be able to iterate over any container of string
, like 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;
}
Upvotes: 25
Views: 16878
Reputation: 51445
yes
http://www.boost.org/doc/libs/1_45_0/libs/utility/enable_if.html
http://www.cplusplus.com/reference/std/iterator/iterator_traits/
template<class I>
typename enable_if<
is_same<typename iterator_traits<I>::value_type, string>
>::type
function(...
Upvotes: 14
Reputation: 273
Please try this, this would work in all container:
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);
Note: Don't forget to include<string>,
And auto is available in c++ 11
Upvotes: -3
Reputation: 13560
Create a template
template<class iterator_type>
void dumpStrings(iterator_type it, iterator_type end)
{
while (it != end) {
cout << *(it++) << endl;
}
}
The template also removes the limit of the container value type to string. Note that you need the parentheses around the it++.
Upvotes: 29
Reputation: 14621
I don't think there's anything as simple as you'd like. Ideally, you could just do something like
void dumpStrings(AbstractIterator<string> beg, AbstractIterator<string> end) { }
but the STL iterators don't seem to have any inheritance hierarchy, irritatingly enough. So it looks like you're stuck with using function templates - that's how it's done in the STL Algorithms Library.
Sorry - I wish there was a better way, too, but this'll have to do. Just remember to declare the full function template in the header file!
Upvotes: 5