Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Declare a function accepting generic iterator

Tags:

c++

iterator

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;
}
like image 711
Simon P. Avatar asked Feb 19 '11 23:02

Simon P.


3 Answers

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++.

like image 139
Fox32 Avatar answered Nov 16 '22 22:11

Fox32


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(...
like image 36
Anycorn Avatar answered Nov 16 '22 22:11

Anycorn


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!

like image 5
Xavier Holt Avatar answered Nov 16 '22 23:11

Xavier Holt