如何编写一个可以返回iterator或reverse_iterator的c ++函数

Sid*_*Bob 5 c++ iterator

据我所知,在c ++中没有包含迭代器和reverse_iterator的公共基类.

到目前为止我唯一看到的建议是使用模板来解决这个问题( 如何编写一个以通用方式获取迭代器或集合的函数?)

然而,这个解决方案似乎对我不起作用.

class MyClass
{
    template<typename Iter> Iter* generate_iterator(...params...)
    {
        //returns either a vector::iterator or vector::reverse_iterator
    }
    template<typename Iter> void do_stuff(Iter *begin, Iter *end)
    {
        //does stuff between elements specified by begin and end
        //I would like this function to remain agnostic of which direction it is working in!
    }
    void caller()
    {
        //I would like this function to remain agnostic of which direction it is working in too...
           do_stuff(generate_iterator(blah),generate_iterator(foo));
    }
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,generate_iterator()不能按需使用,因为编译器抱怨"generate_iterator不是MyClass类的成员",大概是因为我没有指定它(我实际上不能这样做,因为调用者应该不知道迭代器类型).

有人可以帮忙吗?提前致谢!

编辑:正如Mark B所指出的那样,generate_iterator必须返回一个指针 - 现在已经修正了

更新:刚开始使用这个http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/start_page.html它似乎工作...

Mar*_*k B 2

在 C++ 中,您无法编写返回两种不同类型的函数。在您的模板情况下,它将根据实例化返回其中之一。您可能会返回一个指向多态迭代器的基指针,但这会让我问您在这里真正想要做什么。即使标准容器也不会尝试这样做:它们具有beginrbegin正确区分。我建议有两个单独的函数,每个函数都做正确的事情,并根据上下文指示返回一种类型的迭代器或另一种类型。

另一方面,请注意,您无法隐式确定仅用于函数返回类型的类型的模板实例化。

  • 另一方面,Adobe 有一个对迭代器执行擦除的“any_iterator”类型,这似乎表明考虑实现可以使用不同迭代器类型的非模板化代码并不罕见...... (4认同)