c++ - 如何编写可以返回迭代器或反向迭代器的 C++ 函数

标签 c++ iterator

据我所知,在 C++ 中,没有涵盖 iterator 和 reverse_iterator 的公共(public)基类。

到目前为止我看到的唯一建议是使用模板来解决这个问题( How to write a function that takes an iterator or collection in a generic way? )

但是这个解决方案似乎对我不起作用。

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));
    }
};

在这种情况下,generate_iterator() 不能按需要使用,因为编译器提示“generate_iterator 不是 MyClass 类的成员”,大概是因为我没有指定它(我在实践中不能指定它,因为调用者应该是不可知的迭代器类型)。

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

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

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

最佳答案

您可以创建自己的迭代器类,它知道如何进行双向操作。封装两种类型的迭代器,并在内部选择您初始化时使用的任何一种。

这是一个开始:

template<typename Container>
class BiIterator
{
public:
    BiIterator(Container::iterator i) : m_fwd(i), m_isforward(true) {}
    BiIterator(Container::reverse_iterator i) : m_rev(i), m_isforward(false) {}
    bool operator==(const BiIterator & left, const BiIterator & right);
    Container::value_type & operator*()
    {
        if (m_isforward)
            return *m_fwd;
        return *m_rev;
    }
    const Container::value_type & operator*() const;
    BiIterator & operator++()
    {
        if (m_isforward)
            ++m_fwd;
        else
            ++m_rev;
        return *this;
    }
private:
    Container::iterator         m_fwd;
    Container::reverse_iterator m_rev;
    bool                        m_isforward;
};

关于c++ - 如何编写可以返回迭代器或反向迭代器的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6707886/

相关文章:

lua - Lua-具有可变参数数量的迭代器

java - 添加/删除元素的设计模式

c++ - 通过构造时获取的指针修改const对象

c++ - 识别字符串中的 C 11 关键字(string.at() 问题)

c++ - 纯虚方法 stub 是在什么条件下生成的?

Java - 带条件的对象循环?

C++ MFC窗口(框架)操作

c++ - 并发访问 QTcpSocket 对象

c++ - 使用迭代器循环遍历迭代器 vector

java - Java 中具有多个条件的迭代器循环