Declare a function accepting generic iterator

后端 未结 4 689
慢半拍i
慢半拍i 2021-01-31 10:17

Given this code, is it possible to change dumpStrings() to be able to iterate over any container of string, like say a list

相关标签:
4条回答
  • 2021-01-31 10:37

    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!

    0 讨论(0)
  • 2021-01-31 10:38

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

    0 讨论(0)
  • 2021-01-31 10:48

    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(...
    
    0 讨论(0)
  • 2021-01-31 10:51

    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

    0 讨论(0)
提交回复
热议问题