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;
}
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++.
yes
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(...
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!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With