c++ - 我可以轻松地覆盖 (STL) 迭代器的类别吗?

标签 c++ stl iterator

现在,我有一个类可以通过随机访问迭代器满足 API 要求。但是,我可以设想这样一种情况,即实现会发生变化,只能提供一个前向迭代器。

因此,我想限制调用者使用随机访问功能。我知道我可以编写自己的实现(例如 restricted_bar_iterator),但想知道是否有更简单的方法(即需要更少的编码)。

class BAR { ... };

class FOO {
public:
    // Bad...clients may expect 'bar_iterator' to be random access...
    typedef std::vector<BAR>::iterator bar_iterator;

    bar_iterator begin_bar() const;
    bar_iterator end_bar() const;

    // Possible solution here!
    class restricted_bar_iterator :
        public std::iterator< std::forward_iterator_tag, BAR > { ... };
};


void baz()
{
    FOO foo;
    bar_iterator it = foo.begin_bar() + 5; // want a compile time error here!
}

最佳答案

这是一个使用 Boost Iterator Adaptor 的例子.我用了int而不是 BAR .

#include <boost/iterator/iterator_adaptor.hpp>
#include <vector>

struct iterator :
    public boost::iterator_adaptor<
        iterator,                    // the name of our class, see docs for details
        std::vector<int>::iterator,  // underlying base iterator
        boost::use_default,          // for value type
        boost::forward_traversal_tag // all the boilerplate for this!
    >
{
     // need this to convert from vector::iterator to ours
     explicit iterator(std::vector<int>::iterator i)
      : iterator::iterator_adaptor_(i) {}
};

int main()
{
    std::vector<int> v;
    iterator it(v.begin());
    ++it;    // OK
    it += 1; // ERROR
}

这有效地使用了 std::vector<T>::iterator作为基类,但只允许为前向迭代器定义的操作。缺点是错误消息 - 它们不是很漂亮。

关于c++ - 我可以轻松地覆盖 (STL) 迭代器的类别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126008/

相关文章:

c++ - 交换 multimap<int, int> 中的每对值

java - 具有类型混淆的自定义 Java 迭代器

c++ - 同时迭代两个或多个容器的最佳方法是什么

c++ - 如何创建一个将从输入流中读取下一个值的仿函数?

c++ - 如何为对象使用优先级队列 STL?

c++ - 检查原始文件 C++ 的输出

c++ - 为简单结构定义哪个复制/move 构造函数/运算符?

c++ - 无效使用::- C++ 禁止使用没有类型的 vector

c++ - 如何打印具有 vector 的 multimap 元素?

c++ - 在 C++ 中调用带有 char* 参数和 bool 参数的多态函数的优先级